cuu %!s(int64=5) %!d(string=hai) anos
pai
achega
315a9a12b1

+ 168 - 23
Menu/GameShell/10_Settings/Bluetooth/__init__.py

@@ -1,10 +1,9 @@
-
 # -*- coding: utf-8 -*- 
 
 import pygame
 #import math
 import  commands
-
+import dbus
 #from beeprint import pp
 from libs.roundrects import aa_round_rect
 
@@ -27,6 +26,14 @@ from UI.skin_manager import SkinManager
 
 from UI.multilabel import MultiLabel
 
+from net_item import NetItem
+
+
+class BleInfoPage(Page):
+    _FootMsg =  ["Nav.","Disconnect","Forget","Back",""]
+    _MyList = []
+    _ListFontObj = fonts["varela15"]    
+
 
 class BleListSelector(PageSelector):
     _BackgroundColor = SkinManager().GiveColor('Front')
@@ -42,7 +49,7 @@ class BleListSelector(PageSelector):
     def Draw(self):
         idx = self._Parent._PsIndex
         if idx < len( self._Parent._WirelessList):
-            x = self._Parent._WirelessList[idx]._PosX+11
+            x = self._Parent._WirelessList[idx]._PosX+2
             y = self._Parent._WirelessList[idx]._PosY+1
             h = self._Parent._WirelessList[idx]._Height -3
         
@@ -51,7 +58,7 @@ class BleListSelector(PageSelector):
             self._Height = h
 
             aa_round_rect(self._Parent._CanvasHWND,  
-                          (x,y,self._Width,h),self._BackgroundColor,4,0,self._BackgroundColor)
+                          (x,y,self._Width-4,h),self._BackgroundColor,4,0,self._BackgroundColor)
 
 class BleListMessageBox(Label):
     _Parent = None
@@ -97,11 +104,26 @@ class BluetoothPage(Page):
 
     _InfoPage          = None
     
+    _ADAPTER_DEV  = "hci0"
+    
     def __init__(self):
         Page.__init__(self)
         self._WirelessList = []
         self._CanvasHWND = None
     
+    def ShowBox(self,msg):
+        
+        self._MsgBox._Text = msg
+        self._ShowingMessageBox = True
+        self._Screen.Draw()
+        self._MsgBox.Draw()
+        self._Screen.SwapAndShow()
+    
+    def HideBox(self):
+        self.Draw()
+        self._ShowingMessageBox = False
+        self._Screen.SwapAndShow()    
+    
     def Init(self):
         
         self._PosX = self._Index * self._Screen._Width
@@ -118,46 +140,153 @@ class BluetoothPage(Page):
         self._Ps = ps
         self._PsIndex = 0
         
-        msgbox = WifiListMessageBox()
+        msgbox = BleListMessageBox()
         msgbox._CanvasHWND = self._CanvasHWND
         msgbox.Init(" ",fonts["veramono12"])
         msgbox._Parent = self
         
         self._MsgBox = msgbox     
 
-    def DbusPropertiesChanged:## signal_name = "PropertiesChanged",
-        pass
+        self._Scroller = ListScroller()
+        self._Scroller._Parent = self
+        self._Scroller._PosX = 2
+        self._Scroller._PosY = 2
+        self._Scroller.Init()
+        
+        self.GenNetworkList()
+        
+
+    def print_normal(self,address, properties):
+        print("[ " + address + " ]")
+
+        for key in properties.keys():
+            value = properties[key]
+            if type(value) is dbus.String:
+                value = unicode(value).encode('ascii', 'replace')
+            if (key == "Class"):
+                print("    %s = 0x%06x" % (key, value))
+            else:
+                print("    %s = %s" % (key, value))
+
+        print()
+
+	properties["Logged"] = True
+
+    def skip_dev(self,old_dev, new_dev):
+        if not "Logged" in old_dev:
+            return False
+        if "Name" in old_dev:
+            return True
+        if not "Name" in new_dev:
+            return True
+        return False
+
+    def DbusPropertiesChanged(self, interface, changed, invalidated, path):
+        global devices
+        
+        if interface != "org.bluez.Device1":
+            return
+
+        if path in devices:
+            dev = devices[path]
+
+            if self.skip_dev(dev, changed):
+                return
+            devices[path] = dict(devices[path].items() + changed.items())
+        else:
+            devices[path] = changed
+
+        if "Address" in devices[path]:
+            address = devices[path]["Address"]
+        else:
+            address = "<unknown>"
+
+        self.print_normal(address, devices[path])
+
+    def ShutDownConnecting(self):
+        print("Shutdownconnecting...")
+    
+    def AbortedAndReturnToUpLevel(self):
+        self.HideBox()
+        self._Screen._FootBar.ResetNavText()
+        self.ReturnToUpLevelPage()
+        self._Screen.Draw()
+        self._Screen.SwapAndShow()
+        
+    def CheckIfBluetoothConnecting(self):
+        return True
+    
     
     def GenNetworkList(self):
         self._WirelessList = []
         start_x = 0
         start_y = 0
 
-        for network_id,v in enumerate(self._Devices):
+        for i,v in enumerate(self._Devices):
             ni = NetItem()
             ni._Parent = self
             ni._PosX = start_x
-            ni._PosY = start_y + network_id* NetItem._Height
+            ni._PosY = start_y + i* NetItem._Height
             ni._Width = Width
             ni._FontObj = self._ListFontObj
-            ni.Init()
+            
+            ni.Init(v,self._Devices[v])
+            
             self._WirelessList.append(ni)
 
         self._PsIndex = 0   
     
-    def Rescan():
+    def Rescan(self):
+        proxy_obj = self._Dbus.get_object("org.bluez", "/org/bluez/" + self._ADAPTER_DEV)
+        adapter_props = dbus.Interface(proxy_obj,"org.freedesktop.DBus.Properties")
+        discoverying = adapter_props.Get("org.bluez.Adapter1", "Discovering") 
+        print(discoverying)
+        
         if self._Adapter!= None:
-            self._Adapter.StopDiscovery()
-            self._Adapter.StartDiscovery()
+            try:
+                self._Adapter.StopDiscovery()
+            except Exception,e:
+                print(str(e))
+            
+            try:
+                self._Adapter.StartDiscovery()
+            except Exception,e:
+                print(str(e))
+            
+
+    def ScrollUp(self):
+        if len(self._WirelessList) == 0:
+            return
+        self._PsIndex-=1
+        if self._PsIndex < 0:
+            self._PsIndex = 0
+        
+        cur_ni = self._WirelessList[self._PsIndex]
+        if cur_ni._PosY < 0:
+            for i in range(0,len(self._WirelessList)):
+                self._WirelessList[i]._PosY += self._WirelessList[i]._Height
+            
+    def ScrollDown(self):
+        if len(self._WirelessList) == 0:
+            return
+        self._PsIndex+=1
+        if self._PsIndex >= len(self._WirelessList):
+            self._PsIndex = len(self._WirelessList) -1
+       
+        cur_ni = self._WirelessList[self._PsIndex]
+        if cur_ni._PosY + cur_ni._Height > self._Height:
+            for i in range(0,len(self._WirelessList)):
+                self._WirelessList[i]._PosY -= self._WirelessList[i]._Height
     
-    def KeyDown:
+    def KeyDown(self,event):
         
         if event.key == CurKeys["A"] or event.key == CurKeys["Menu"]:
             if self._Adapter != None:
-                _connecting = self._Wireless.CheckIfBluetoothConnecting()
+                _connecting = self.CheckIfBluetoothConnecting()
                 if _connecting:
                     self.ShutDownConnecting()
                     self.ShowBox("ShutDownConnecting...")
+                    self.AbortedAndReturnToUpLevel()
                 else:
                     self.AbortedAndReturnToUpLevel()
             else:
@@ -178,19 +307,26 @@ class BluetoothPage(Page):
         if event.key == CurKeys["X"]:
             self.Rescan()   
     
-    def Draw():
+    def Draw(self):
         self.ClearCanvas()
         if len(self._WirelessList) == 0:
             return
-        
-        self._Ps.Draw()
-        for i in self._WirelessList:
-            i.Draw()
+                
+        if len(self._WirelessList) * NetItem._Height > self._Height:
+            self._Ps._Width = self._Width - 11
+            self._Ps.Draw()
             
-        self._Scroller.UpdateSize( len(self._WirelessList)*NetItem._Height, self._PsIndex*NetItem._Height)
-        self._Scroller.Draw()
-
+            for i in self._WirelessList:
+                i.Draw()        
+            
+            self._Scroller.UpdateSize( len(self._WirelessList)*NetItem._Height, self._PsIndex*NetItem._Height)
+            self._Scroller.Draw()
+        else:
+            self._Ps._Width = self._Width
+            self._Ps.Draw()
 
+            for i in self._WirelessList:
+                i.Draw()
 
 
 
@@ -204,7 +340,10 @@ class APIOBJ(object):
     _Page = None
     def __init__(self):
         pass
+    
     def Init(self,main_screen):
+        global bus,devices,adapter
+        
         self._Page = BluetoothPage()
         self._Page._Dbus = bus
         self._Page._Devices = devices
@@ -215,6 +354,12 @@ class APIOBJ(object):
         
         self._Page.Init()
         
+        bus.add_signal_receiver(self._Page.DbusPropertiesChanged,
+			dbus_interface = "org.freedesktop.DBus.Properties",
+			signal_name = "PropertiesChanged",
+			arg0 = "org.bluez.Device1",
+			path_keyword = "path")
+            
     def API(self,main_screen):
         if main_screen !=None:
             main_screen.PushPage(self._Page)

+ 149 - 0
Menu/GameShell/10_Settings/Bluetooth/net_item.py

@@ -0,0 +1,149 @@
+# -*- coding: utf-8 -*- 
+
+import pygame
+
+## local UI import
+from UI.page   import Page
+from UI.label  import Label
+from UI.fonts  import fonts
+from UI.icon_item import IconItem
+from UI.multi_icon_item  import MultiIconItem
+from UI.icon_pool   import MyIconPool
+from UI.skin_manager import SkinManager
+
+
+class NetItemMultiIcon(MultiIconItem):
+    _CanvasHWND = None
+    _Parent     = None
+    _Width      = 18
+    _Height     = 18
+    
+    def Draw(self):
+        self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height),
+                              (0,self._IconIndex*self._IconHeight,self._IconWidth,self._IconHeight))
+    
+class NetItemIcon(IconItem):
+
+    _CanvasHWND = None
+    _Parent     = None
+    _Width      = 18
+    _Height     = 18
+    
+    def Draw(self):
+        self._CanvasHWND.blit(self._ImgSurf,(self._PosX,self._PosY+(self._Parent._Height-self._Height)/2,self._Width,self._Height))
+
+            
+class NetItem(object):
+    _PosX = 0
+    _PosY = 0
+    _Width = 0
+    _Height = 30
+    
+    _Atts  = {}
+    
+    _Channel=""  # '10' 
+    _Stren = ""  ## 19%
+
+    _Parent = None
+    _IsActive = False
+
+    _Icons  = {} ## wifi strength and security icons
+    _Labels = {}
+    _FontObj = None
+    
+    _RSSI = 0
+    _MacAddr=""
+    _Path  = "" #/org/bluez/hci0/dev_34_88_5D_97_FF_26
+    
+    def __init__(self):
+        self._Labels = {}
+        self._Icons = {}
+
+    def SetActive(self,act):
+        self._IsActive = act
+    
+    def Init(self, path, object):
+        self._Path = path
+        self._Atts = object 
+        
+        is_active=False
+        if "Address" in object:
+            self._MacAddr = object["Address"]
+        
+        if  "Connected" in object:
+            if object["Connected"] == 1:
+                is_active=True
+        
+        if is_active:
+            theString = ">> "+theString[1:]
+            self.SetActive(is_active)
+        
+
+        name_label = Label()
+        name_label._PosX = 16
+        name_label._CanvasHWND = self._Parent._CanvasHWND
+
+        mac_addr = self._MacAddr
+        
+        if "Name" in object:
+            if len(object["Name"]) > 3:
+                mac_addr = object["Name"]
+        
+        if "RSSI" in object:
+            print(object["RSSI"])
+            self._RSSI = int(object["RSSI"])
+        
+        name_label.Init(mac_addr,self._FontObj)
+        
+        self._Labels["mac_addr"] = name_label
+
+        done_icon = NetItemIcon()
+        done_icon._ImgSurf = MyIconPool._Icons["done"]
+        done_icon._CanvasHWND = self._Parent._CanvasHWND
+        done_icon._Parent = self
+        
+        self._Icons["done"] = done_icon
+
+
+        ## reuse the resource from TitleBar
+        nimt = NetItemMultiIcon()
+        nimt._ImgSurf = self._Parent._Screen._TitleBar._Icons["wifistatus"]._ImgSurf
+        nimt._CanvasHWND = self._Parent._CanvasHWND
+        nimt._Parent = self
+        self._Icons["wifistatus"] = nimt
+
+        #pp(theString)
+    
+    
+    def Connect(self,notworkentry=None):
+        """ Execute connection. """
+        #dev = dbus.Interface(bus.get_object("org.bluez", "/org/bluez/hci0/dev_"+"34_88_5D_97_FF_26"), "org.bluez.Device1")
+        proxy_obj = self._Parent._Dbus.get_object("org.bluez",self._Path)
+        dev = self._Parent._Dbus.Interface(proxy_obj, "org.bluez.Device1")
+        dev.Connect()
+
+    def Draw(self):
+        #pygame.draw.line(self._Parent._CanvasHWND,(169,169,169),(self._PosX,self._PosY),(self._PosX+self._Width,self._PosY),1)
+        for i in self._Labels:
+            self._Labels[i]._PosY = self._PosY + (self._Height - self._Labels[i]._Height)/2
+            self._Labels[i].Draw()
+            
+        if self._IsActive:
+            self._Icons["done"].NewCoord(320-14,self._PosY)
+            self._Icons["done"].Draw()
+        
+        """
+        ge = 0
+        if ge > 0:
+            self._Icons["wifistatus"]._IconIndex = ge
+            self._Icons["wifistatus"].NewCoord(self._Width-23,self._PosY)
+            self._Icons["wifistatus"].Draw()
+            
+        else:
+            self._Icons["wifistatus"]._IconIndex = 0
+            self._Icons["wifistatus"].NewCoord(self._Width-23,self._PosY)
+            self._Icons["wifistatus"].Draw()
+        
+        """
+        pygame.draw.line(self._Parent._CanvasHWND,SkinManager().GiveColor('Line'),
+            (self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1)

+ 1 - 0
Menu/GameShell/10_Settings/list_page.py

@@ -80,6 +80,7 @@ class ListPage(Page):
         alist         = [["","Airplane","Airplane Mode"],
                          ["","PowerOptions","Power Options"],
                          ["","Wifi","Wi-Fi"],
+                         ["","Bluetooth","Bluetooth"],
                          ["","Sound","Sound Volume"],
                          ["","Brightness","BackLight Brightness"],
                          ["","Storage",""],