Merge branch 'acid-burn/bug_439_dvdplayer_missing_titlestring' into experimental
[enigma2.git] / lib / python / Screens / ParentalControlSetup.py
index 2a9074665896145c06dff70c9e09bb7f7336def9..284294fcbf892861c1e618d37422ae723eb6e30c 100644 (file)
@@ -1,58 +1,68 @@
 from Screen import Screen
-from Components.ConfigList import ConfigList, ConfigListScreen
+from Components.ConfigList import ConfigListScreen
 from Components.ActionMap import NumberActionMap
 from Components.config import config, getConfigListEntry, ConfigNothing, NoSave, ConfigPIN
-from Components.ServiceList import ServiceList
 from Components.ParentalControlList import ParentalControlEntryComponent, ParentalControlList 
-from Components.ParentalControl import parentalControl
+
+from Components.Sources.StaticText import StaticText
 from Screens.ChoiceBox import ChoiceBox
 from Screens.MessageBox import MessageBox
-from Screens.InputBox import InputBox, Input, PinInput
-from Tools.Directories import resolveFilename, SCOPE_CONFIG
+from Screens.InputBox import PinInput
+from Screens.ChannelSelection import service_types_tv
 from Tools.BoundFunction import boundFunction
-from ServiceReference import ServiceReference
-from enigma import eServiceCenter, eServiceReference
-import os
-import operator
+from enigma import eServiceCenter, eTimer, eServiceReference
+from operator import itemgetter
 
 class ProtectedScreen:
        def __init__(self):
                if self.isProtected():
-                       self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.protectedWithPin()], title = self.getPinText(), windowTitle = _("Change pin code")))
+                       self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.protectedWithPin()], triesEntry = self.getTriesEntry(), title = self.getPinText(), windowTitle = _("Enter pin code")))
+
+       def getTriesEntry(self):
+               return config.ParentalControl.retries.setuppin
 
        def getPinText(self):
                return _("Please enter the correct pin code")
-       
+
        def isProtected(self):
                return True
-       
+
        def protectedWithPin(self):
                return config.ParentalControl.setuppin.value
-       
+
        def pinEntered(self, result):
-               if result[0] is None:
+               if result is None:
                        self.close()
-               if not result[0]:
-                       print result, "-", self.protectedWithPin()
+               elif not result:
                        self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
 
 class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen):
        def __init__(self, session):
                Screen.__init__(self, session)
-               
                ProtectedScreen.__init__(self)
+               # for the skin: first try ParentalControlSetup, then Setup, this allows individual skinning
+               self.skinName = ["ParentalControlSetup", "Setup" ]
+               self.setup_title = _("Parental control setup")
+               self.onChangedEntry = [ ]
+
+               self.list = []
+               ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.changedEntry)
+               self.createSetup()
                
                self["actions"] = NumberActionMap(["SetupActions"],
                {
-                       "cancel": self.keyCancel
+                 "cancel": self.keyCancel,
+                 "save": self.keyCancel
                }, -2)
-               
-               self.list = []
-               ConfigListScreen.__init__(self, self.list)
-               self.createSetup()
-       
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("OK"))
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               self.setTitle(self.setup_title)
+
        def isProtected(self):
-               return config.ParentalControl.setuppinactive.value
+               return config.ParentalControl.setuppinactive.value and config.ParentalControl.configured.value
        
        def createSetup(self):
                self.editListEntry = None
@@ -62,80 +72,133 @@ class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen):
                self.list = []
                self.list.append(getConfigListEntry(_("Enable parental control"), config.ParentalControl.configured))
                print "config.ParentalControl.configured.value", config.ParentalControl.configured.value
+               self.editBouquetListEntry = -1
+               self.reloadLists = -1
                if config.ParentalControl.configured.value:
                        #self.list.append(getConfigListEntry(_("Configuration mode"), config.ParentalControl.mode))
                        self.list.append(getConfigListEntry(_("Protect setup"), config.ParentalControl.setuppinactive))
                        if config.ParentalControl.setuppinactive.value:
-                               self.changeSetupPin = getConfigListEntry(_("Change setup pin"), NoSave(ConfigNothing()))
+                               self.changeSetupPin = getConfigListEntry(_("Change setup PIN"), NoSave(ConfigNothing()))
                                self.list.append(self.changeSetupPin)
                        self.list.append(getConfigListEntry(_("Protect services"), config.ParentalControl.servicepinactive))
                        if config.ParentalControl.servicepinactive.value:
                                self.list.append(getConfigListEntry(_("Parental control type"), config.ParentalControl.type))
                                if config.ParentalControl.mode.value == "complex":
-                                       self.changePin = getConfigListEntry(_("Change service pins"), NoSave(ConfigNothing()))
+                                       self.changePin = getConfigListEntry(_("Change service PINs"), NoSave(ConfigNothing()))
                                        self.list.append(self.changePin)
                                elif config.ParentalControl.mode.value == "simple":     
-                                       self.changePin = getConfigListEntry(_("Change service pin"), NoSave(ConfigNothing()))
+                                       self.changePin = getConfigListEntry(_("Change service PIN"), NoSave(ConfigNothing()))
                                        self.list.append(self.changePin)
-                               self.list.append(getConfigListEntry(_("Remember service pin"), config.ParentalControl.storeservicepin)) 
+                               #Added Option to remember the service pin
+                               self.list.append(getConfigListEntry(_("Remember service PIN"), config.ParentalControl.storeservicepin)) 
+                               #Added Option to remember the cancellation of service pin entry
+                               self.list.append(getConfigListEntry(_("Remember service PIN cancel"), config.ParentalControl.storeservicepincancel))    
                                self.editListEntry = getConfigListEntry(_("Edit services list"), NoSave(ConfigNothing()))
                                self.list.append(self.editListEntry)
+                               #New funtion: Possibility to add Bouquets to whitelist / blacklist
+                               self.editBouquetListEntry = getConfigListEntry(_("Edit bouquets list"), NoSave(ConfigNothing()))
+                               self.list.append(self.editBouquetListEntry)
+                               #New option to reload service lists (for example if bouquets have changed)
+                               self.reloadLists = getConfigListEntry(_("Reload Black-/Whitelists"), NoSave(ConfigNothing()))
+                               self.list.append(self.reloadLists)
                                
                self["config"].list = self.list
                self["config"].setList(self.list)
-               
+
        def keyOK(self):
                print "self[\"config\"].l.getCurrentSelection()", self["config"].l.getCurrentSelection()
                if self["config"].l.getCurrentSelection() == self.editListEntry:
                        self.session.open(ParentalControlEditor)
+               elif self["config"].l.getCurrentSelection() == self.editBouquetListEntry:
+                       self.session.open(ParentalControlBouquetEditor)
                elif self["config"].l.getCurrentSelection() == self.changePin:
                        if config.ParentalControl.mode.value == "complex":
                                pass
                        else:
-                               self.session.open(ParentalControlChangePin, config.ParentalControl.servicepin[0], _("service pin"))
+                               self.session.open(ParentalControlChangePin, config.ParentalControl.servicepin[0], _("service PIN"))
                elif self["config"].l.getCurrentSelection() == self.changeSetupPin:
-                       self.session.open(ParentalControlChangePin, config.ParentalControl.setuppin, _("setup pin"))
+                       self.session.open(ParentalControlChangePin, config.ParentalControl.setuppin, _("setup PIN"))
+               elif self["config"].l.getCurrentSelection() == self.reloadLists:
+                       from Components.ParentalControl import parentalControl
+                       parentalControl.open()
                else:
                        ConfigListScreen.keyRight(self)
                        print "current selection:", self["config"].l.getCurrentSelection()
                        self.createSetup()
-                       
+
        def keyLeft(self):
                ConfigListScreen.keyLeft(self)
                print "current selection:", self["config"].l.getCurrentSelection()
-               self.createSetup()              
-                       
+               self.createSetup()
+
        def keyRight(self):
                ConfigListScreen.keyRight(self)
                print "current selection:", self["config"].l.getCurrentSelection()
                self.createSetup()
-       
+
+       def SetupPinMessageCallback(self, value):
+               if value:
+                       self.session.openWithCallback(self.cancelCB, ParentalControlChangePin, config.ParentalControl.setuppin, _("setup PIN"))
+               else:
+                       config.ParentalControl.setuppinactive.value = False
+                       self.keyCancel()
+
+       def ServicePinMessageCallback(self, value):
+               if value:
+                       self.session.openWithCallback(self.cancelCB, ParentalControlChangePin, config.ParentalControl.servicepin[0], _("service PIN"))
+               else:
+                       config.ParentalControl.servicepinactive.value = False
+                       self.keyCancel()
+
+       def cancelCB(self,value):
+               self.keyCancel()
+
        def keyCancel(self):
-               for x in self["config"].list:
-                       x[1].save()
-               self.close()
-       
+               if config.ParentalControl.setuppinactive.value and config.ParentalControl.setuppin.value == 'aaaa':
+                       self.session.openWithCallback(self.SetupPinMessageCallback, MessageBox, _("No valid setup PIN found!\nDo you like to change the setup PIN now?\nWhen you say 'No' here the setup protection stay disabled!"), MessageBox.TYPE_YESNO)
+               elif config.ParentalControl.servicepinactive.value and config.ParentalControl.servicepin[0].value == 'aaaa':
+                       self.session.openWithCallback(self.ServicePinMessageCallback, MessageBox, _("No valid service PIN found!\nDo you like to change the service PIN now?\nWhen you say 'No' here the service protection stay disabled!"), MessageBox.TYPE_YESNO)
+               else:
+                       for x in self["config"].list:
+                               x[1].save()
+                       self.close()
+
        def keyNumberGlobal(self, number):
                pass
 
+       # for summary:
+       def changedEntry(self):
+               for x in self.onChangedEntry:
+                       x()
+
+       def getCurrentEntry(self):
+               return self["config"].getCurrent()[0]
+
+       def getCurrentValue(self):
+               return str(self["config"].getCurrent()[1].getText())
+
+       def createSummary(self):
+               from Screens.Setup import SetupSummary
+               return SetupSummary
+
+SPECIAL_CHAR = 96
 class ParentalControlEditor(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
-
                self.list = []
                self.servicelist = ParentalControlList(self.list)
                self["servicelist"] = self.servicelist;
-               
                #self.onShown.append(self.chooseLetter)
-               self.currentLetter = ''
-               
+               self.currentLetter = chr(SPECIAL_CHAR)
                self.readServiceList()
-               
+               self.chooseLetterTimer = eTimer()
+               self.chooseLetterTimer.callback.append(self.chooseLetter)
+               self.onLayoutFinish.append(self.LayoutFinished)
+
                self["actions"] = NumberActionMap(["DirectionActions", "ColorActions", "OkCancelActions", "NumberActions"],
                {
                        "ok": self.select,
                        "cancel": self.cancel,
-                       "red": self.chooseLetter,
                        #"left": self.keyLeft,
                        #"right": self.keyRight,
                        "1": self.keyNumberGlobal,
@@ -149,79 +212,118 @@ class ParentalControlEditor(Screen):
                        "9": self.keyNumberGlobal,
                        "0": self.keyNumberGlobal
                }, -1)
-               
+
+       def LayoutFinished(self):
+               self.chooseLetterTimer.start(0, True)
+
        def cancel(self):
-               parentalControl.save()
-               self.close()
-               
+               self.chooseLetter()
+
        def select(self):
                self.servicelist.toggleSelectedLock()
-       
+
        def keyNumberGlobal(self, number):
                pass
-       
+
        def readServiceList(self):
                serviceHandler = eServiceCenter.getInstance()
-               self.service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25)'
-               refstr = '%s ORDER BY name' % (self.service_types_tv)
+               refstr = '%s ORDER BY name' % (service_types_tv)
                self.root = eServiceReference(refstr)
-               
                self.servicesList = {}
-               
                list = serviceHandler.list(self.root)
                if list is not None:
-                       while 1:
-                               s = list.getNext()
-                               if s.valid():
-                                       service = s.toString()
-                                       name = ServiceReference(service).getServiceName()
-                                       key = name.lower()[0]
-                                       if key < 'a' or key > 'z':
-                                               key = '&'
-                                       #key = str(key)
-                                       if not self.servicesList.has_key(key):
-                                               self.servicesList[key] = []
-                                       # (servicestring, eServiceRef, name)
-                                       self.servicesList[key].append((service, s, name))
-                               else:
-                                       break
-               print self.servicesList
-
+                       services = list.getContent("CN", True) #(servicecomparestring, name)
+                       for s in services:
+                               key = s[1].lower()[0]
+                               if key < 'a' or key > 'z':
+                                       key = chr(SPECIAL_CHAR)
+                               #key = str(key)
+                               if not self.servicesList.has_key(key):
+                                       self.servicesList[key] = []
+                               self.servicesList[key].append(s)
+                       
        def chooseLetter(self):
                print "choose letter"
-               list = []
+               mylist = []
                for x in self.servicesList.keys():
-                       if x == '&':
-                               x = ("special characters", x)
+                       if x == chr(SPECIAL_CHAR):
+                               x = (_("special characters"), x)
                        else:
                                x = (x, x)
-                       list.append(x)
-               print "sorted list:", sorted(list, key=operator.itemgetter(1))
-               print self.servicesList.keys()
-               self.session.openWithCallback(self.letterChosen, ChoiceBox, title=_("Show services beginning with"), list=list)
-               
+                       mylist.append(x)
+               mylist.sort(key=itemgetter(1))
+               sel = ord(self.currentLetter) - SPECIAL_CHAR
+               self.session.openWithCallback(self.letterChosen, ChoiceBox, title=_("Show services beginning with"), list=mylist, keys = [], selection = sel)
+
        def letterChosen(self, result):
+               from Components.ParentalControl import parentalControl
                if result is not None:
                        print "result:", result
                        self.currentLetter = result[1]
-                       self.list = []
-                       for x in self.servicesList[result[1]]:
-                               self.list.append(ParentalControlEntryComponent(x[1], x[2], parentalControl.getProtectionLevel(x[1]) != -1))
-                       self.servicelist.setList(self.list)                     
+                       #Replace getProtectionLevel by new getProtectionType
+                       self.list = [ParentalControlEntryComponent(x[0], x[1], parentalControl.getProtectionType(x[0])) for x in self.servicesList[result[1]]]
+                       self.servicelist.setList(self.list)
+               else:
+                       parentalControl.save()
+                       self.close()
+
+class ParentalControlBouquetEditor(Screen):
+       #This new class allows adding complete bouquets to black- and whitelists
+       #The servicereference that is stored for bouquets is their refstr as listed in bouquets.tv
+       def __init__(self, session):
+               Screen.__init__(self, session)
+               self.skinName = "ParentalControlEditor"
+               self.list = []
+               self.bouquetslist = ParentalControlList(self.list)
+               self["servicelist"] = self.bouquetslist;
+               self.readBouquetList()
+               self.onLayoutFinish.append(self.selectBouquet)
+
+               self["actions"] = NumberActionMap(["DirectionActions", "ColorActions", "OkCancelActions"],
+               {
+                       "ok": self.select,
+                       "cancel": self.cancel
+               }, -1)
+
+       def cancel(self):
+               from Components.ParentalControl import parentalControl
+               parentalControl.save()
+               self.close()
+
+       def select(self):
+               self.bouquetslist.toggleSelectedLock()
+
+       def readBouquetList(self):
+               serviceHandler = eServiceCenter.getInstance()
+               refstr = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"bouquets.tv\" ORDER BY bouquet'
+               bouquetroot = eServiceReference(refstr)
+               self.bouquetlist = {}
+               list = serviceHandler.list(bouquetroot)
+               if list is not None:
+                       self.bouquetlist = list.getContent("CN", True)
+       
+       def selectBouquet(self):
+               from Components.ParentalControl import parentalControl
+               self.list = [ParentalControlEntryComponent(x[0], x[1], parentalControl.getProtectionType(x[0])) for x in self.bouquetlist]
+               self.bouquetslist.setList(self.list)
 
 class ParentalControlChangePin(Screen, ConfigListScreen, ProtectedScreen):
        def __init__(self, session, pin, pinname):
                Screen.__init__(self, session)
+               # for the skin: first try ParentalControlChangePin, then Setup, this allows individual skinning
+               self.skinName = ["ParentalControlChangePin", "Setup" ]
+               self.setup_title = _("Change pin code")
+               self.onChangedEntry = [ ]
 
                self.pin = pin
-
                self.list = []
                self.pin1 = ConfigPIN(default = 1111, censor = "*")
                self.pin2 = ConfigPIN(default = 1112, censor = "*")
-               self.list.append(getConfigListEntry(_("New pin"), NoSave(self.pin1)))
-               self.list.append(getConfigListEntry(_("Reenter new pin"), NoSave(self.pin2)))
+               self.pin1.addEndNotifier(boundFunction(self.valueChanged, 1))
+               self.pin2.addEndNotifier(boundFunction(self.valueChanged, 2))
+               self.list.append(getConfigListEntry(_("New PIN"), NoSave(self.pin1)))
+               self.list.append(getConfigListEntry(_("Reenter new PIN"), NoSave(self.pin2)))
                ConfigListScreen.__init__(self, self.list)
-               
 #              print "old pin:", pin
                #if pin.value != "aaaa":
                        #self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.pin.value], title = _("please enter the old pin"), windowTitle = _("Change pin code")))
@@ -230,35 +332,63 @@ class ParentalControlChangePin(Screen, ConfigListScreen, ProtectedScreen):
                self["actions"] = NumberActionMap(["DirectionActions", "ColorActions", "OkCancelActions"],
                {
                        "cancel": self.cancel,
+                       "red": self.cancel,
+                       "save": self.keyOK,
                }, -1)
-               
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("OK"))
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               self.setTitle(self.setup_title)
+
+       def valueChanged(self, pin, value):
+               if pin == 1:
+                       self["config"].setCurrentIndex(1)
+               elif pin == 2:
+                       self.keyOK()
+
        def getPinText(self):
-               return _("Please enter the old pin code")
+               return _("Please enter the old PIN code")
 
        def isProtected(self):
                return (self.pin.value != "aaaa")
 
        def protectedWithPin(self):
                return self.pin.value
-               
+
 #      def pinEntered(self, result):
                #if result[0] is None:
                        #self.close()
                #if not result[0]:
                        #print result, "-", self.pin.value
                        #self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
-       
+
        def keyOK(self):
                if self.pin1.value == self.pin2.value:
                        self.pin.value = self.pin1.value
                        self.pin.save()
-                       self.session.openWithCallback(self.close, MessageBox, _("The pin code has been changed successfully."), MessageBox.TYPE_INFO)
+                       self.session.openWithCallback(self.close, MessageBox, _("The PIN code has been changed successfully."), MessageBox.TYPE_INFO)
                else:
-                       self.session.open(MessageBox, _("The pin codes you entered are different."), MessageBox.TYPE_ERROR)
-       
+                       self.session.open(MessageBox, _("The PIN codes you entered are different."), MessageBox.TYPE_ERROR)
+
        def cancel(self):
                self.close(None)
-       
+
        def keyNumberGlobal(self, number):
                ConfigListScreen.keyNumberGlobal(self, number)
-               
+
+       # for summary:
+       def changedEntry(self):
+               for x in self.onChangedEntry:
+                       x()
+
+       def getCurrentEntry(self):
+               return self["config"].getCurrent()[0]
+
+       def getCurrentValue(self):
+               return str(self["config"].getCurrent()[1].getText())
+
+       def createSummary(self):
+               from Screens.Setup import SetupSummary
+               return SetupSummary