Показаны сообщения с ярлыком n9. Показать все сообщения
Показаны сообщения с ярлыком n9. Показать все сообщения

среда, 28 марта 2012 г.

QML. Первое приложение для Nokia N9.

Как и обещал ранее в целях изучения я написал маленькое приложение на QML.
Я прочитал на хабре статью Как легко творить прекрасное и взял код из этой статьи за основу.
Была задача на сделать законченное приложение показывающее картинки из интернета и имеющее элементы управления.
"Прекрасное" с хабрахабра дало мне дополнительные силы и заставляло концентрироваться на документации.

Вот что из этого получилось.


Вся программа составляет примерно 290 срок.
Можно скопировать ее отсюда и вставить в новый проект Qt Creator, заменив содержимое main.qml

import QtQuick 1.1
import com.nokia.meego 1.0

Window {
    id: mainWnd
    width: 480
    height: 854

    property real interVal: 5000
    property int y1: 0
    property int y2: 0

    function getPictureURL(){
        var str = '' + Math.round(Math.random() * 5055);
        while (str.length < 5) {
            str = '0' + str;
        }
        var url = "http://media.oboobs.ru/boobs/"+ str + ".jpg";
        return url;
    }

    state: (screen.currentOrientation === Screen.Portrait) ? "portrait" : "landscape"

    states: [
        State {
            name: "landscape"
            PropertyChanges { target: aRectStatMsg; width: 814}

            PropertyChanges { target: aRectChangeDealy; x: 20}
            PropertyChanges { target: aRectChangeDealy; y: 80}
            PropertyChanges { target: aRectChangeDealy; width: 550}
            PropertyChanges { target: aRectChangeDealy; height: 380}

            PropertyChanges { target: aRectReloadPic; x: 590}
            PropertyChanges { target: aRectReloadPic; y: 80}
            PropertyChanges { target: aRectReloadPic; width: 244}
            PropertyChanges { target: aRectReloadPic; height: 180}

            PropertyChanges { target: aRectPausePic; x: 590}
            PropertyChanges { target: aRectPausePic; y: 280}
            PropertyChanges { target: aRectPausePic; width: 244}
            PropertyChanges { target: aRectPausePic; height: 180}

            PropertyChanges { target: arrow_uppng; anchors.topMargin: 33}
            PropertyChanges { target: arrow_downpng; anchors.bottomMargin: 33}
        },
        State {
            name: "portrait"
            PropertyChanges { target: aRectStatMsg; width: 440}

            PropertyChanges { target: aRectChangeDealy; x: 20}
            PropertyChanges { target: aRectChangeDealy; y: 80}
            PropertyChanges { target: aRectChangeDealy; width: 260}
            PropertyChanges { target: aRectChangeDealy; height: 740}

            PropertyChanges { target: aRectReloadPic; x: 300}
            PropertyChanges { target: aRectReloadPic; y: 80}
            PropertyChanges { target: aRectReloadPic; width: 160}
            PropertyChanges { target: aRectReloadPic; height: 362}

            PropertyChanges { target: aRectPausePic; x: 300}
            PropertyChanges { target: aRectPausePic; y: 457}
            PropertyChanges { target: aRectPausePic; width: 160}
            PropertyChanges { target: aRectPausePic; height: 363}

            PropertyChanges { target: arrow_uppng; anchors.topMargin: 80}
            PropertyChanges { target: arrow_downpng; anchors.bottomMargin: 80}
        }
    ]


    Image {
        id: image1
        opacity: 1
        fillMode: Image.PreserveAspectFit
        anchors.fill: parent
        source: ""
        onStatusChanged: if (status === Image.Error) source = getPictureURL()
    }

    Timer {
        id: myTimer
        interval: mainWnd.interVal
        running: true
        repeat: true
        onTriggered: image1.source = getPictureURL()
    }

    Rectangle {
        id: layerControl
        anchors.fill: parent
        color: "transparent"
        opacity: 0.4
        radius: 10
        property bool activOpacity: false

        states:[
            State {
                name: "showOn"; when: layerControl.activOpacity === true
                PropertyChanges { target: layerControl; opacity: 0.7; }
            },
            State {
                name: "showOff"; when: layerControl.activOpacity === false
                PropertyChanges { target: layerControl; opacity: 0.01 }
            }
        ]

        transitions: [
            Transition {
                from: "showOff"; to: "showOn";
                NumberAnimation { properties: "opacity"; duration: 100 }
            },

            Transition {
                from: "showOn"; to: "showOff";
                NumberAnimation { properties: "opacity"; duration: 1000 }
            }
        ]

        Rectangle {
            id: aRectStatMsg
            x: 20
            y: 20
            width: 440
            height: 40
            radius: parent.radius
            color: "steelblue"

            Text {
                id: actionDescription
                x: 10
                font.family: "Helvetica"
                font.bold: true
                font.pixelSize: 32
                color: "#35bcff"
                text: ""
             }
        }

        Rectangle {
            id: aRectChangeDealy
            x: 20
            y: 80
            width: 260
            height: 740
            radius: parent.radius
            color: "steelblue"

            MouseArea {
                anchors.fill: parent

                onPositionChanged: {
                    mainWnd.y1 = mainWnd.y2
                    mainWnd.y2 = mouseY
                    if ((mainWnd.y2 - mainWnd.y1) > 0)
                        mainWnd.interVal += 100
                    else
                        mainWnd.interVal -= 100
                    if ( mainWnd.interVal < 1000)
                        mainWnd.interVal = 1000
                    actionDescription.text = "SlideShow Timeout = " + Math.round(mainWnd.interVal / 1000)  + "sec"
                    console.log("PositionChanged: " + mainWnd.y1 + ", " + mainWnd.y2)
                }
                onPressed: {
                    layerControl.activOpacity = true
                    console.log("aRectChangeDealy pressed")
                }
                onReleased: {
                    layerControl.activOpacity = false
                    console.log("aRectChangeDealy released")
                }
            }

            Image {
                id: arrow_uppng
                anchors.horizontalCenter: aRectChangeDealy.horizontalCenter
                anchors.top: aRectChangeDealy.top
                anchors.topMargin: 80
//                y: 80
                source: "arrow_up.png"
                MouseArea {
                    anchors.fill: parent

                    onPressed: {
                        mainWnd.interVal -= 1000
                        if ( mainWnd.interVal < 1000)
                            mainWnd.interVal = 1000
                        actionDescription.text = "SlideShow Timeout = " + Math.round(mainWnd.interVal / 1000)  + "sec"
                        layerControl.activOpacity = true
                        console.log("arrow_uppng pressed")
                    }
                    onReleased: {
                        layerControl.activOpacity = false
                        console.log("arrow_uppng released")
                    }
                }
            }

            Image {
                id: arrow_downpng
                anchors.horizontalCenter: aRectChangeDealy.horizontalCenter
                anchors.bottom: aRectChangeDealy.bottom
                anchors.bottomMargin: 80
//                y: 532
                source: "arrow_down.png"
                MouseArea {
                    anchors.fill: parent

                    onPressed: {
                        mainWnd.interVal += 1000
                        actionDescription.text = "SlideShow Timeout = " + Math.round(mainWnd.interVal / 1000)  + "sec"
                        layerControl.activOpacity = true
                        console.log("arrow_downpng pressed")
                    }
                    onReleased: {
                        layerControl.activOpacity = false
                        console.log("arrow_downpng released")
                    }
                }
            }

        }

        Rectangle {
            id: aRectReloadPic
            x: 300
            y: 80
            width: 160
            height: 362
            radius: parent.radius
            color: "steelblue"
            Image {
                anchors.horizontalCenter: aRectReloadPic.horizontalCenter
                anchors.verticalCenter: aRectReloadPic.verticalCenter
                id: repeatpng
                source: "repeat.png"
            }

            MouseArea {
                anchors.fill: parent

                onPressed: {
                    image1.source = getPictureURL()
                    myTimer.restart()
                    actionDescription.text = "Loading next picture"
                    layerControl.activOpacity = true
                    console.log("aRectReloadPic pressed")
                    if (image1.status == Image.Error) console.log('Ошибка загрузки картинки')
                }
                onReleased: {
                    layerControl.activOpacity = false
                    console.log("aRectReloadPic released")
                }
            }
        }

        Rectangle {
            id: aRectPausePic
            x: 300
            y: 457
            width: 160
            height: 363
            radius: parent.radius
            color: "steelblue"
            Image {
                anchors.horizontalCenter: aRectPausePic.horizontalCenter
                anchors.verticalCenter: aRectPausePic.verticalCenter
                id: pausepng
                source: "pause.png"
            }
            MouseArea {
                anchors.fill: parent

                onPressed: {
                    myTimer.stop()
                    actionDescription.text = "SlideShow stoped"
                    layerControl.activOpacity = true
                    console.log("aRectPausePic pressed")
                }
                onReleased: {
                    layerControl.activOpacity = false
                    console.log("aRectPausePic released")
                }
            }
        }
    }
}
Скомпилированное приложение можно скачать по этой ссылке: slideshow_0.1.1_armel.deb
Полностью проект (tarball) можно скачать по это1 ссылке: bobshow_v0.1.1.tar.gz

вторник, 6 марта 2012 г.

Nokia N9. Мод экрана вызова.

Последнее обновление прошивки PR1.3 для Nokia N9 дало по утверждению разработчиков более 1000 обновлений и полезных функций.
Одновременно поменялись таблицы стилей, описывающие вид выводимых экранов.
По этой причине мод, изменяющий размер аватары, сделанный для прошивки PR1.1 и PR1.2 не подходит для PR1.3.

Я сделал собственный мод, который увеличивает аватар и размер клавиш "снять трубку" и "отбой".

//Including the carmode styles of call-ui
@import "carmode-call-ui.css" // * Plugs the carmode styles for callui *
/*
    NOTE:
        Telephony layout guide was built using 35px status bar.
        Here we assume using the whole page height (screen height -status bar)
        and add the -1px correction into any value relative to available screen
        height.
*/

// ***************************************************************************
// ** CONSTANTS **************************************************************

// ** screen (page) dimensions **
@const PAGE_HEIGHT                     : 818px; // == full height (854px) - $HEIGHT_STATUSBAR (36px)
@const PAGE_WIDTH                      : 480px; // == full width (480px)

@const PAGE_HEIGHT_LS                  : 444px; // == full height (480px) - $HEIGHT_STATUSBAR (36px)
@const PAGE_WIDTH_FULL_LS              : 854px;

// ** CallWidget **
@const CALLWIDGET_SIZE                 : $PAGE_WIDTH 544px;
@const CALLWIDGET_SIZE_MINIMIZED       : $PAGE_WIDTH 64px;
@const CALLWIDGET_SIZE_VIDEO           : $PAGE_WIDTH_FULL_LS $PAGE_HEIGHT_LS;
@const CALLWIDGET_SIZE_VIDEO_MINIMIZED : $PAGE_WIDTH_FULL_LS 64px;
@const CALLWIDGET_SIZE_VIDEO_MAXIMIZED : $PAGE_WIDTH 380px; // PAGE_HEIGHT_LS - 64

// ** Avatar **
//@const AVATAR_SIZE               : 64px 64px;
@const AVATAR_SIZE               : 256px 256px;

// ** InfoPanel **
@const CALLINFO_SIZE_NORMAL             : $PAGE_WIDTH 124px;
@const CALLINFO_SIZE_NORMAL_MAX         : $PAGE_WIDTH    -1;
@const CALLINFO_SIZE_MINIMIZED          : $PAGE_WIDTH  64px;
@const CALLINFO_SIZE_VIDEO              : 592px 85px;
@const CALLINFO_SIZE_VIDEOPAGE_INCOMING     : $PAGE_WIDTH 124px; // FIXME: random value
@const CALLINFO_SIZE_VIDEOPAGE_INCOMING_MAX : $PAGE_WIDTH    -1; // FIXME: random value



// ***************************************************************************
// ** Window overrides *******************************************************

MWindowStyle {
    x11-startup-pixmap:;
    startup-fill-color: #000000;
}

MWindowStyle.Portrait {
    x11-startup-pixmap:;
    startup-fill-color: #000000;
}

MWindowStyle.Landscape {
    x11-startup-pixmap:;
    startup-fill-color: #000000;
}

MApplicationWindowStyle#DisabledStatusMenu {
    status-bar-style-name: "CommonStatusBarNoMenu";
}


// ***************************************************************************
// ** Container (application page) *******************************************

#CallApplicationPage {
    offset           : 0 0;

    minimum-size     : 100% 100%;
    preferred-size   : 100% 100%;
    maximum-size     : 100% 100%;

    margin-left      : 0;
    margin-right     : 0;
    margin-top       : 0;
    margin-bottom    : 0;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;

    background-color : #000000;

    background-image :;
}


// ***************************************************************************
// ** CallAvatar *************************************************************

#CallAvatar {
    margin-left      : 0;
    margin-right     : 0;
    margin-top       : 0;
    margin-bottom    : 0;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;

    preferred-size   : -1 -1;
    minimum-size     : -1 -1;
    maximum-size     : -1 -1;

    background-color :;
    background-image :;

    press-feedback   :;
    release-feedback :;
    cancel-feedback  :;
}

#CallAvatar:pressed {
    background-color :;
    background-image :;
}

#CallAvatarImage {
    margin-left    : 100;  //  Определено эмпирически
    margin-right   : -356; // -100-256 (-(margin-left)-$AVATAR_SIZE)
    margin-top     : -276; // -20-256 (-(margin-bottom)-$AVATAR_SIZE)
    margin-bottom  : 20;  // Бля! Почему "+"?

    padding-left   : 0;
    padding-right  : 0;
    padding-top    : 0;
    padding-bottom : 0;

    preferred-size : $AVATAR_SIZE;
    minimum-size   : $AVATAR_SIZE;
    maximum-size   : $AVATAR_SIZE;
}

#ConfCallAvatarButton {
    background-image   : meegotouch-callui-button-shadowed-background $CORNER_MARGINS;
    background-color   :;
    text-color         :;

    padding-left       : 0;
    padding-top        : 0;
    padding-right      : 0;
    padding-bottom     : 0;

    icon-size          : 40px 40px;
    icon-align         : center;

    margin-left        : 0;
    margin-top         : 0;
    margin-right       : 0;
    margin-bottom      : 0;

    text-margin-left   : 0;
    text-margin-top    : 0;
    text-margin-right  : 0;
    text-margin-bottom : 0;

    preferred-size     : $AVATAR_SIZE;
    minimum-size       : $AVATAR_SIZE;
    maximum-size       : $AVATAR_SIZE;

    press-feedback     :;
    release-feedback   :;
}

#ConfCallAvatarButton:pressed {
    background-image   : meegotouch-callui-button-shadowed-background-pressed $CORNER_MARGINS;
    background-color   :;
}


// ***************************************************************************
// ** CallInfoPanel **********************************************************

CallInfoPanelStyle {
    margin-left      : 0;
    margin-right     : 0;
    margin-top       : 0;
    margin-bottom    : 0;

    padding-left     : $MARGIN_XLARGE;
    padding-right    : $MARGIN_XLARGE;
    padding-top      : 8px;
    padding-bottom   : 0px;

    background-image :;
    background-color :;

    press-feedback   :;
    release-feedback :;
    cancel-feedback  :;
}

#CallInfoPanel_Normal {
    minimum-size   : $CALLINFO_SIZE_NORMAL;
    maximum-size   : $CALLINFO_SIZE_NORMAL_MAX;
    preferred-size : $CALLINFO_SIZE_NORMAL_MAX;
}

#CallInfoPanel_Minimized {
    padding-top    : 0;

    minimum-size   : $CALLINFO_SIZE_MINIMIZED;
    maximum-size   : $CALLINFO_SIZE_MINIMIZED;
    preferred-size : $CALLINFO_SIZE_MINIMIZED;
}

#CallInfoPanel_Video {
    minimum-size       : $CALLINFO_SIZE_VIDEO;
    maximum-size       : $CALLINFO_SIZE_VIDEO;
    preferred-size     : $CALLINFO_SIZE_VIDEO;

    padding-left       : 0px;

    background-color   : #000000;
    background-opacity : 0.30;
}

#CallInfoPanel_VideoPage_Incoming {
    minimum-size   : $CALLINFO_SIZE_VIDEOPAGE_INCOMING;
    maximum-size   : $CALLINFO_SIZE_VIDEOPAGE_INCOMING_MAX;
    preferred-size : $CALLINFO_SIZE_VIDEOPAGE_INCOMING_MAX;

    // FIXME: hack for pushing buttons down a bit to workaround some
    // serious insanity with MGridLayoutPolicy
    //margin-bottom  : 72px;
}


// ***************************************************************************
// ** Buttons ****************************************************************

MButtonStyle:disabled {
    background-image : none;
    background-color : none;
    text-color       : none;
}

MButtonStyle:disabled-selected {
    background-image : none;
    background-image : none;
    text-color       : none;
}


#CallUi_EndButton {
    background-image : meegotouch-callui-button-reject-background $CORNER_MARGINS;

    preferred-size   : 210px 64px;
    minimum-size     : 210px 64px;
    maximum-size     : 210px 64px;

    icon-align       : center;
    icon-size        : 48px 48px;

    press-feedback   : priority2_callbutton_press;
    release-feedback : priority2_callbutton_release;
    cancel-feedback  :;

    margin-left      : 0;
    margin-right     : 0;
    margin-top       : 0;
    margin-bottom    : 0;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;
}

#CallUi_EndButton:pressed {
    background-image : meegotouch-callui-button-reject-background-pressed $CORNER_MARGINS;
}

#CallUi_EndButton_Video {
    background-image : meegotouch-callui-button-reject-background $CORNER_MARGINS;

    preferred-size   : 230px 64px;
    minimum-size     : 230px 64px;
    maximum-size     : 230px 64px;

    icon-align       : center;
    icon-size        : 48px 48px;

    press-feedback   : priority2_callbutton_press;
    release-feedback : priority2_callbutton_release;
    cancel-feedback  :;

    margin-left      : $MARGIN_XLARGE;
    margin-right     : $MARGIN_XLARGE;
    margin-top       : $MARGIN_XLARGE;
    margin-bottom    : $MARGIN_XLARGE;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;
}

#CallUi_EndButton_Video:pressed {
    background-image : meegotouch-callui-button-reject-background-pressed $CORNER_MARGINS;
}

// Кнопка Redial 8)
#CallUi_RedialButton {
    background-image : meegotouch-callui-button-answer-background $CORNER_MARGINS;

    preferred-size   : 210px 128px;
    minimum-size     : 210px 128px;
    maximum-size     : 210px 128px;
//    preferred-size   : 210px 64px;
//    minimum-size     : 210px 64px;
//    maximum-size     : 210px 64px;

    icon-id          :;

    press-feedback   : priority2_callbutton_press;
    release-feedback : priority2_callbutton_release;
    cancel-feedback  :;

    font             : $FONT_FAMILY bold uppercase 2.2mm ;//22px
    text-color       : #F5F5F5;

    margin-left      : 0;
    margin-right     : 0;
    margin-top       : 0;
    margin-bottom    : 24px;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;
}

#CallUi_RedialButton:pressed {
    background-image : meegotouch-callui-button-answer-background-pressed $CORNER_MARGINS;
}

// Кнопка отмены в экране входящего вызова
#CallUi_RejectButton {
    background-image : meegotouch-callui-button-reject-background $CORNER_MARGINS;

    preferred-size   : 210px 128px;
    minimum-size     : 210px 128px;
    maximum-size     : 210px 128px;

    margin-left      : 12px; // 24px / 2
    margin-right     : 0;
    margin-top       : 0;
    margin-bottom    : 0;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;

    icon-align       : center;
    icon-size        : 48px 48px;

    press-feedback   : priority2_callbutton_press;
    release-feedback : priority2_callbutton_release;
    cancel-feedback  :;
}

#CallUi_RejectButton:pressed {
    background-image : meegotouch-callui-button-reject-background-pressed $CORNER_MARGINS;
}


// Кнопка "Снять трубку" в экране входящего вызова
#CallUi_AnswerButton {
    background-image : meegotouch-callui-button-answer-background $CORNER_MARGINS;

    preferred-size   : 210px 128px;
    minimum-size     : 210px 128px;
    maximum-size     : 210px 128px;

    margin-left      : 0;
    margin-right     : 12px; // 24px / 2
    margin-top       : 0;
    margin-bottom    : 0;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;

    icon-align       : center;
    icon-size        : 48px 48px;

    press-feedback   : priority2_callbutton_press;
    release-feedback : priority2_callbutton_release;
    cancel-feedback  :;
}

#CallUi_AnswerButton:pressed {
    background-image : meegotouch-callui-button-answer-background-pressed $CORNER_MARGINS;
}


#CallUi_SendMessageButton {
    background-image : meegotouch-callui-button-general-background $CORNER_MARGINS;

    preferred-size   : 210px 64px;
    minimum-size     : 210px 64px;
    maximum-size     : 210px 64px;

    margin-left      : 12px; // 18px -buttom group left margin
    margin-right     : 12px; // 24px / 2
    margin-top       : 0;
    margin-bottom    : 0;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;

    icon-align       : center;
    icon-size        : 48px 48px;

    press-feedback   :;
    release-feedback :;
    cancel-feedback  :;
}

#CallUi_SendMessageButton:pressed {
    background-image : meegotouch-callui-button-general-background-pressed $CORNER_MARGINS;
    background-color :;
}


#CallUi_IconButton {
    font                  : $FONT_FAMILY light 1.8mm;//18px
    text-color            : #8C8C8C;
    vertical-text-align   : vcenter;
    horizontal-text-align : hcenter;

    icon-size             : 64px 64px;
    icon-align            : center;

    background-color      :;
    background-image      :;

    margin-left           : 0px;
    margin-right          : 0px;
    margin-top            : 26px; // button margin (22) + separator bottom margin (4)
    margin-bottom         : 0px;

    minimum-size          : 95px 87px;  // full height (113) - top margin (26)
    preferred-size        : 95px 87px;
    maximum-size          : 95px 87px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;

    text-margin-left      : 0;
    text-margin-top       : 5px;
    text-margin-right     : 0;
    text-margin-bottom    : 0;

    text-wrap-mode        : nowrap;
    text-eliding          : false;
}

#CallUi_IconButton:pressed {
    background-image :;
    background-color :;
}

#CallUi_IconButton:selected {
    background-image :;
    background-color :;
}


#CallUi_VideoButton {
    background-image : meegotouch-callui-button-shadowed-background $CORNER_MARGINS;
    background-color : none;


    preferred-size   : 210px 64px;
    minimum-size     : 210px 64px;
    maximum-size     : 210px 64px;

    icon-align       : center;
    icon-size        : 48px 48px;

    icon-id          : "icon-m-telephony-video-call-button";

    press-feedback   :;
    release-feedback :;
    cancel-feedback  :;

    margin-left      : 0;
    margin-right     : 0;
    margin-top       : 0;
    margin-bottom    : 24px;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;

    content-opacity  : 1.0;
}

#CallUi_VideoButton:pressed {
    background-image : meegotouch-callui-button-shadowed-background-pressed $CORNER_MARGINS;
    background-color : none;
}

#CallUi_VideoButton:disabled {
    background-image : meegotouch-callui-button-shadowed-background $CORNER_MARGINS;
    background-color : none;
    content-opacity  : 0.3;
}


#CallUi_SpeakerButton {
    font                  : $FONT_FAMILY light 1.8mm;//18px
    text-color            : #8C8C8C;
    vertical-text-align   : vcenter;
    horizontal-text-align : hcenter;

    icon-size             : 64px 64px;
    icon-align            : center;

    background-color      :;
    background-image      :;

    margin-left           : 0px;
    margin-right          : 14px;
    margin-top            : 26px; // button margin (22) + separator bottom margin (4)
    margin-bottom         : 0px;

    minimum-size          : 95px 92px;  // full height (113) - top margin (26) + text margin (5)
    preferred-size        : 95px 92px;
    maximum-size          : 95px 92px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;

    text-margin-left      : 0;
    text-margin-top       : 0;
    text-margin-right     : 0;
    text-margin-bottom    : 0;

    text-wrap-mode        : nowrap;
    text-eliding          : false;
}

#CallUi_SpeakerButton:pressed {
    background-image :;
    background-color :;
}

#CallUi_SpeakerButton:selected {
    background-image :;
    background-color :;
}


#CallUi_MuteButton {
    font                  : $FONT_FAMILY light 1.8mm;//18px
    text-color            : #8C8C8C;
    vertical-text-align   : vcenter;
    horizontal-text-align : hcenter;

    icon-size             : 64px 64px;
    icon-align            : center;

    background-color      :;
    background-image      :;

    margin-left           : 15px;
    margin-right          : 15px;
    margin-top            : 26px; // button margin (22) + separator bottom margin (4)
    margin-bottom         : 0px;

    minimum-size          : 95px 92px;  // full height (113) - top margin (26) + text margin (5)
    preferred-size        : 95px 92px;
    maximum-size          : 95px 92px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;

    text-margin-left      : 0;
    text-margin-top       : 0;
    text-margin-right     : 0;
    text-margin-bottom    : 0;

    text-wrap-mode        : nowrap;
    text-eliding          : false;
}

#CallUi_MuteButton:pressed {
    background-image :;
    background-color :;
}

#CallUi_MuteButton:selected {
    background-image :;
    background-color :;
}

#CallUi_MuteButton_Video {
    font                  : $FONT_FAMILY light 1.8mm;//18px
    text-color            : #C8C8C8;
    vertical-text-align   : vcenter;
    horizontal-text-align : hcenter;

    icon-size             : 64px 64px;
    icon-align            : center;

    background-color      :;
    background-image      :;

    margin-left           : 0;
    margin-right          : 0;
    margin-top            : $MARGIN_XLARGE;
    margin-bottom         : 0;

    padding-left          : 0;
    padding-right         : 0;
    padding-top           : 0;
    padding-bottom        : 0;

    minimum-size          : -1 87px;
    preferred-size        : -1 87px;
    maximum-size          : -1 87px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;

    text-margin-left      : 0;
    text-margin-top       : 0;
    text-margin-right     : 0;
    text-margin-bottom    : 0;

    text-wrap-mode        : nowrap;
    text-eliding          : false;
}

#CallUi_MuteButton_Video:pressed {
    background-image :;
    background-color :;
}

#CallUi_MuteButton_Video:selected {
    background-image :;
    background-color :;
}


#CallUi_HoldButton {
    font                  : $FONT_FAMILY light 1.8mm;//18px
    text-color            : #8C8C8C;
    vertical-text-align   : vcenter;
    horizontal-text-align : hcenter;

    icon-size             : 64px 64px;
    icon-align            : center;

    background-color      :;
    background-image      :;

    margin-left           : 15px;
    margin-right          : 15px;
    margin-top            : 26px; // button margin (22) + separator bottom margin (4)
    margin-bottom         : 0px;

    minimum-size          : 95px 92px;  // full height (113) - top margin (26) + text margin (5)
    preferred-size        : 95px 92px;
    maximum-size          : 95px 92px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;

    text-margin-left      : 0;
    text-margin-top       : 0;
    text-margin-right     : 0;
    text-margin-bottom    : 0;

    text-wrap-mode        : nowrap;
    text-eliding          : false;
}

#CallUi_HoldButton:pressed {
    background-image :;
    background-color :;
}

#CallUi_HoldButton:selected {
    background-image :;
    background-color :;
}


#CallUi_DialpadButton {
    font                  : $FONT_FAMILY light 1.8mm;//18px
    text-color            : #8C8C8C;
    vertical-text-align   : vcenter;
    horizontal-text-align : hcenter;

    icon-size             : 64px 64px;
    icon-align            : center;

    background-color      :;
    background-image      :;

    margin-left           : 14px;
    margin-right          : 0px;
    margin-top            : 26px; // button margin (22) + separator bottom margin (4)
    margin-bottom         : 0px;

    minimum-size          : 95px 92px;  // full height (113) - top margin (26) + text margin (5)
    preferred-size        : 95px 92px;
    maximum-size          : 95px 92px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;

    text-margin-left      : 0;
    text-margin-top       : 0;
    text-margin-right     : 0;
    text-margin-bottom    : 0;

    text-wrap-mode        : nowrap;
    text-eliding          : false;
}

#CallUi_DialpadButton:pressed {
    background-image :;
    background-color :;
}

#CallUi_DialpadButton:selected {
    background-image :;
    background-color :;
}


#CallUi_ViewMenuButton {
    background-image :;
    background-color :;

    icon-align       : center;
    icon-size        : 48px 48px;

    preferred-size   : 48px 48px;
    minimum-size     : 48px 48px;
    maximum-size     : 48px 48px;

    press-feedback   :;
    release-feedback :;
    cancel-feedback  :;

    margin-left      :  0px;
    margin-right     :  0px;
    margin-top       : 16px;
    margin-bottom    :  0px;
}

#CallUi_ViewMenuButton:pressed {
    background-image :;
    background-color :;
}


#CallUi_SilenceButton {
    preferred-size   : 210px 64px;
    minimum-size     : 210px 64px;
    maximum-size     : 210px 64px;

    margin-left      : 0;
    margin-right     : 0;
    margin-top       : 0;
    margin-bottom    : 0;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;

    icon-align       : center;
    icon-size        : 48px 48px;

    press-feedback   :;
    release-feedback :;
    cancel-feedback  :;

    background-image : meegotouch-callui-button-shadowed-background $CORNER_MARGINS;
    background-color :;

    content-opacity  : 1.0;
}

#CallUi_SilenceButton:pressed {
    background-image : meegotouch-callui-button-shadowed-background-pressed $CORNER_MARGINS;
    background-color :;
}

#CallUi_SilenceButton:disabled {
    background-image : meegotouch-callui-button-shadowed-background $CORNER_MARGINS;
    background-color :;
    content-opacity  : 0.3;
}


#CallUi_ButtonGroup {
    margin-left    : 0;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;

    padding-left   :  6px;
    padding-right  :  6px;
    padding-top    :  0px;
    padding-bottom : 24px;

    preferred-size : $PAGE_WIDTH 420px;
    minimum-size   : $PAGE_WIDTH 420px;
    maximum-size   : $PAGE_WIDTH 420px;
}

#CallUi_ButtonGroup_Incoming {
    margin-left    : 0;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;

    padding-left   :  18px;
    padding-right  :  18px;
    padding-top    :  16px;
    padding-bottom : 113px;

    preferred-size : $PAGE_WIDTH 420px;
    minimum-size   : $PAGE_WIDTH 420px;
    maximum-size   : $PAGE_WIDTH 420px;
}

#CallUi_ButtonGroup_VideoPage_Incoming {
    margin-left    : 0;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;

    padding-left   :  16px;
    padding-right  :  16px;
    padding-top    :  16px;
    padding-bottom :  24px;

    preferred-size : $PAGE_WIDTH 240px;
    minimum-size   : $PAGE_WIDTH 240px;
    maximum-size   : $PAGE_WIDTH 240px;
}

#CallUi_SplitButton {
    icon-size             : 64px 64px;
    icon-align            : center;

    background-image      :;
    background-color      :;

    margin-left           : 16px;
    margin-right          : 0;
    margin-top            : 0;
    margin-bottom         : 0;

    minimum-size          : 64px 64px;
    preferred-size        : 64px 64px;
    maximum-size          : 64px 64px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;
}

#CallUi_SplitButton:pressed {
    background-image :;
    background-color :;
}


#CallUi_DropButton {
    icon-size             : 64px 64px;
    icon-align            : center;

    background-image      :;
    background-color      :;

    margin-left           : 16px;
    margin-right          : 0;
    margin-top            : 0;
    margin-bottom         : 0;

    minimum-size          : 64px 64px;
    preferred-size        : 64px 64px;
    maximum-size          : 64px 64px;

    press-feedback        : priority2_callbutton_press;
    release-feedback      : priority2_callbutton_release;
    cancel-feedback       :;
}

#CallUi_DropButton:pressed {
    background-image :;
    background-color :;
}


// The mode switch slider
SliderWidgetStyle {
    minimum-size     : 128px 64px;
    preferred-size   : 128px 64px;
    maximum-size     : 128px 64px;

    margin-bottom    : 0;
    margin-right     : $MARGIN_XLARGE;
    margin-top       : $MARGIN_XLARGE;
    margin-left      : 0;

    padding-left     : 0;
    padding-right    : 0;
    padding-top      : 0;
    padding-bottom   : 0;

    size             : 128px 64px;

    thumb-size       : 54px 54px;
    thumb-margin     : 5px;

    icon-size        : 48px 48px;
    icon-margin      : 8px;

    background-image : meegotouch-videocall-camera-switch-background $CORNER_MARGINS;
    background-color :;

    press-feedback   :;
    release-feedback :;
}


// ***************************************************************************
// ** generic layout/policy without margins or spacing ***********************

#ZeroLayout {
    vertical-spacing   : 0;
    horizontal-spacing : 0;

    margin-left        : 0;
    margin-right       : 0;
    margin-top         : 0;
    margin-bottom      : 0;
}


// ***************************************************************************
// ** invisible widget *******************************************************

#ZeroSizeWidget {
    minimum-size   : 0 0;
    maximum-size   : 0 0;
    preferred-size : 0 0;

    margin-left    : 0;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;

    padding-left   : 0;
    padding-right  : 0;
    padding-top    : 0;
    padding-bottom : 0;

    background-image : none;
}


// ***************************************************************************
// ** icons ******************************************************************

#CallUi_InfoIcon_Single {
    margin-left    : $MARGIN_XLARGE;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;

    padding-left   : 0;
    padding-right  : 0;
    padding-top    : 0;
    padding-bottom : 0;

    minimum-size   : 32px 32px;
    maximum-size   : 32px 32px;
    preferred-size : 32px 32px;
}

#CallUi_InfoIcon_Left {
    margin-left    : $MARGIN_XLARGE;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;

    minimum-size   : 32px 32px;
    maximum-size   : 32px 32px;
    preferred-size : 32px 32px;
}

#CallUi_InfoIcon_Right {
    margin-left    : $MARGIN_LARGE;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;

    minimum-size   : 32px 32px;
    maximum-size   : 32px 32px;
    preferred-size : 32px 32px;
}

#CallUi_MinimizedCallIcon {
    maximum-size   : 32px 32px;
    minimum-size   : 32px 32px;
    preferred-size : 32px 32px;

    margin-left    : 0;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;
}


// ***************************************************************************
// ** labels *****************************************************************

#CallUi_BalanceLabel {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY light 1.8mm ;//18px
    color         : #C8C8C8;
}

#CallUi_DurationLabel {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY light 2.2mm ;//22px
    color         : #C8C8C8;
}

#CallUi_DurationLabel_Minimised {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY light 2.2mm ;//22px
    color         : #C8C8C8;
}

#CallUi_NameLabel_In_Out {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;
    maximum-size  : -1 38px;

    font          : $FONT_FAMILY bold 3.2mm ;//32px
    color         : #FFFFFF;
}

#CallUi_NameLabel_Ongoing {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;
    maximum-size  : -1 38px;

    font          : $FONT_FAMILY bold 3.2mm ;//32px
    color         : #62B700;
}

#CallUi_NameLabel_Held {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;
    maximum-size  : -1 38px;

    font          : $FONT_FAMILY bold 3.2mm ;//32px
    color         : #C8C8C8;
}

#CallUi_NameLabel_Ended {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;
    maximum-size  : -1 38px;

    font          : $FONT_FAMILY bold 3.2mm ;//32px
    color         : #FF4036;
}

#CallUi_NameLabel_Minimised_In_Out {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY bold 2.4mm ;//24px
    color         : #FFFFFF;
}

#CallUi_NameLabel_Minimised_Ongoing {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY bold 2.4mm ;//24px
    color         : #62B700;
}

#CallUi_NameLabel_Minimised_Held {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY bold 2.4mm ;//24px
    color         : #C8C8C8;
}

#CallUi_NameLabel_Minimised_Ended{
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY bold 2.4mm ;//24px
    color         : #FF4036;
}

#CallUi_StatusLabel {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY light 1.8mm ;//18px
    color         : #C8C8C8;
}

#CallUi_StatusLabel_Minimised {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY light 1.8mm ;//18px
    color         : #C8C8C8;
}

#CallUi_IncomingInfoLabel {
    margin-left   : $MARGIN_XLARGE;
    margin-right  : 0;
    margin-top    : 0;
    margin-bottom : 0;

    minimum-size  : 0 0;

    font          : $FONT_FAMILY light 2.2mm ;//22px
    color         : #FF4036; // warning color
}

#CallUi_CameraModeLabel {
    margin-left    : 0;
    margin-right   : 0;
    margin-top     : 0;
    margin-bottom  : 0;

    minimum-size   : 128px 23px;
    preferred-size : 128px 23px;
    maximum-size   : 128px 23px;

    font           : $FONT_FAMILY light 1.8mm ;//18px
    color          : #C8C8C8;
}

// ***************************************************************************
// ** Call UI - custom style for all the random stuff ************************
CustomAttributesStyle {

    // CallWidget y-position in different configurations
    call-pos-1     : 274; // From ALG: 64 +64 +63 +72 +12 (-1px correction for ALG values)
    call-pos-2-2   :   0; // always on top of the screen
    call-pos-3     :   0; // always on top of the screen
    call-pos-2-3   :  64; // below $CALLWIDGET_SIZE_MINIMIZED.height (64px)
}


// ***************************************************************************
// ** CallWidget *************************************************************

CallWidgetStyle {
    margin-left            : 0;
    margin-right           : 0;
    margin-top             : 0;
    margin-bottom          : 0;

    padding-left           : 0;
    padding-right          : 0;
    padding-top            : 0;
    padding-bottom         : 0;

    reactive-margin-left   : 0;
    reactive-margin-right  : 0;
    reactive-margin-top    : 0;
    reactive-margin-bottom : 0;

    press-feedback         :;
    release-feedback       :;
    cancel-feedback        :;

    background-image       :;
    background-color       :;

    minimum-size           : $CALLWIDGET_SIZE;
    maximum-size           : $CALLWIDGET_SIZE;
    preferred-size         : $CALLWIDGET_SIZE;

    // end button needs separate margins to prevent reactive area outside button graphics
    end-button-margin-left    : 129px; // spec margin (135px) -button group padding (6px)
    end-button-margin-right   : 50px; // spec margin

    view-menu-button-margin-right : 31px; // original margin (37px) - button group padding (6px)

    // some video view specific values
    video-controls-bg-pos     : 592px 0px ; // FULL LS PAGE WIDTH (854px) -PREVIEW VIDEO WIDTH (246px) -PREVIEW VIDEO MARGINS (16px)
    video-controls-bg-size    : 262px 444px; // PREVIEW VIDEO WIDTH (246px) -PREVIEW VIDEO MARGINS (16px), FULL PAGE HEIGHT - STATUS BAR
    video-controls-bg-size-fs : 262px 444px; // PREVIEW VIDEO WIDTH (246px) -PREVIEW VIDEO MARGINS (16px), FULL PAGE HEIGHT - STATUS BAR
    // TODO: use this once we are able to hide the the status bar
    //video-controls-bg-size-fs : 262px 480px; // PREVIEW VIDEO WIDTH (246px) -PREVIEW VIDEO MARGINS (16px), FULL PAGE HEIGHT

    video-controls-bg-opacity : 0.30;
}

#CallWidget_Minimized {
    minimum-size     : $CALLWIDGET_SIZE_MINIMIZED;
    maximum-size     : $CALLWIDGET_SIZE_MINIMIZED;
    preferred-size   : $CALLWIDGET_SIZE_MINIMIZED;

    background-image : meegotouch-callui-second-waiting-call-background;
}

#CallWidget_Video_Maximized {
    minimum-size     : $CALLWIDGET_SIZE_VIDEO_MAXIMIZED;
    maximum-size     : $CALLWIDGET_SIZE_VIDEO_MAXIMIZED;
    preferred-size   : $CALLWIDGET_SIZE_VIDEO_MAXIMIZED;

    margin-left      : 187px;
}

#CallWidget_Video_Minimized {
    minimum-size     : $CALLWIDGET_SIZE_VIDEO_MINIMIZED;
    maximum-size     : $CALLWIDGET_SIZE_VIDEO_MINIMIZED;
    preferred-size   : $CALLWIDGET_SIZE_VIDEO_MINIMIZED;

    background-image : meegotouch-callui-second-waiting-call-background;
}

#CallWidget_Video {
    minimum-size     : $CALLWIDGET_SIZE_VIDEO;
    maximum-size     : $CALLWIDGET_SIZE_VIDEO;
    preferred-size   : $CALLWIDGET_SIZE_VIDEO;

    background-color : #000000;
}


// ***************************************************************************
// ** call bubble widget *****************************************************

CallBubbleStyle {
    margin-left            : $MARGIN_XLARGE;
    margin-right           : $MARGIN_XLARGE;
    margin-top             : 0;
    margin-bottom          : 0;

    padding-left           : 0;
    padding-right          : 0;
    padding-top            : 10px; // FIXME!
    padding-bottom         : 18px; // FIXME!

    reactive-margin-left   : 0;
    reactive-margin-right  : 0;
    reactive-margin-top    : 0;
    reactive-margin-bottom : 0;

    press-feedback         :;
    release-feedback       :;
    cancel-feedback        :;

    minimum-size           : 448px 72px; // $PAGE_WIDTH (480px) - 2 * $MARGIN_XLARGE (2*16px)
    maximum-size           : 448px 72px; // $PAGE_WIDTH (480px) - 2 * $MARGIN_XLARGE (2*16px)
    preferred-size         : 448px 72px; // $PAGE_WIDTH (480px) - 2 * $MARGIN_XLARGE (2*16px)

    background-image       : meegotouch-callui-bubble-background $CORNER_MARGINS;
    background-color       :;


    // ** CallBubble specific items **

    bubble-pos: 0px 190px; // 64 +64 +63 (-1px correction for ALG values)

    // animation update interval (fps)
    animation-fps: 15;

    // appear animation duration
    appear-time: 750; // ms

    // disappear animation duration
    disappear-time: 250; //ms

    // bubble hide delay
    hide-delay: 5000; // ms

    // service icon size (see #CallBubbleIcon)
    icon-size: 32px 32px;
}

#CallBubbleText {
    margin-left   : 14px;
    margin-right  : 14px;
    margin-top    : 0;
    margin-bottom : 0;

    font          : $FONT_FAMILY light uppercase 1.6mm;
    color         : #FFFFFF;
}

#CallBubbleIcon {
    margin-left    : 0;
    margin-right   : 14px;
    margin-top     : 0;
    margin-bottom  : 0;

    padding-left   : 0;
    padding-right  : 0;
    padding-top    : 0;
    padding-bottom : 0;

    minimum-size   : 32px 32px;
    maximum-size   : 32px 32px;
    preferred-size : 32px 32px;
}

#CommonItemDividerInverted {
    margin-top     : $MARGIN_LARGE;
}

// ** Speaker Dialog ********************************************************

#SpeakerDialogButton {
    font           : $FONT_FAMILY light 2.0mm ; //20px
    text-color     : #ffffff;

    vertical-text-align   : vcenter;
    horizontal-text-align : hcenter;

    icon-size             : 64px 64px;
    icon-align            : center;

    background-color      :;
    background-image      :;

    margin-left           : 16px;
    margin-right          : 16px;
    margin-top            : 47px;
    margin-bottom         : 35px;

    minimum-size          : -1 112px;
    preferred-size        : -1 112px;
    maximum-size          : -1 112px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;
}

#SpeakerDialogButton:selected {
    font           : $FONT_FAMILY light 2.0mm ; //20px
    text-color     : #0F9900;

    vertical-text-align   : vcenter;
    horizontal-text-align : hcenter;

    icon-size             : 64px 64px;
    icon-align            : center;

    background-color      :;
    background-image      :;

    margin-left           : 16px;
    margin-right          : 16px;
    margin-top            : 47px;
    margin-bottom         : 35px;

    minimum-size          : -1 112px;
    preferred-size        : -1 112px;
    maximum-size          : -1 112px;

    press-feedback        :;
    release-feedback      :;
    cancel-feedback       :;
}

// ** Service Provider Dialog ***********************************************
#CallUiServiceProviderCharacterCounter
{
    margin-left : 24px;
    margin-right: 24px;
}


// ** screen lock widget *****************************************************

ScreenLockEventStyle {
    title-font         : $FONT_FAMILY bold 4.8mm ;//48px
    title-color        : $COLOR_INVERTED_FOREGROUND;

    sub-title-font     : $FONT_FAMILY light 2.6mm ;//26px
    sub-title-color    : $COLOR_INVERTED_FOREGROUND;

    text-area-color    : "#64AF2D";

    forward-icon       : icon-m-telephony-call-diverted 32 32;
    service-icon-size  : 32 32;

    minimum-size       : $PAGE_WIDTH 130;
    preferred-size     : $PAGE_WIDTH 130;
    maximum-size       : $PAGE_WIDTH 190;

    background-color   : #000000;
    background-opacity : 0.8;

    // left margin 16px
    right-margin       : 16;

    title-line-1-pos   : 16   60;
    title-line-2-pos   : 16  120;

    sub-title-pos      : 16  168;

    icon-pos-1        : 432 136; // left_pos = page_width(480) -right_margin(16) -icon_size(32)
    icon-pos-2        : 395 136; // left_pos = service_icon_pos -icon_spacer(5) -icon_size(32)
}

// * Participant Dialog *******************************************************

#CallUiParticipantIconButton {
    minimum-size   : $SIZE_BUTTON $SIZE_BUTTON;
    preferred-size : $SIZE_BUTTON $SIZE_BUTTON;
    maximum-size   : $SIZE_BUTTON $SIZE_BUTTON;

    margin-left    : $MARGIN_DEFAULT;
    margin-top     : $MARGIN_LARGE;
    margin-right   : $INDENT_DEFAULT;
    margin-bottom  : $MARGIN_LARGE;

    icon-size      : $SIZE_ICON_XLARGE $SIZE_ICON_XLARGE;
}


// ** End of File ************************************************************
Скачать: оригинальная call-ui_pr1.3.css, модифицированная call-ui_pr1.3_mod.css

Инсталляция:

  1. Подключите телефон по USB в режиме "mass storage" и скопируйте call-ui_pr1.3_mod.css в каталог Downloads.
  2. Отключите телефон от USB.
  3. Запустите терминал и введите следующие команды:
    devel-su
    Password: rootme
    cd /home/user/MyDocs/Downloads
    cp call-ui_pr1.3_mod.css /usr/share/themes/base/meegotouch/call-ui/style/call-ui.css
    /sbin/reboot
    

Деинсталляция:

  1. Подключите телефон по USB в режиме "mass storage" и скопируйте call-ui_pr1.3.css в каталог Downloads.
  2. Отключите телефон от USB.
  3. Запустите терминал и введите следующие команды:
    devel-su
    Password: rootme
    cd /home/user/MyDocs/Downloads
    cp call-ui_pr1.3.css /usr/share/themes/base/meegotouch/call-ui/style/call-ui.css
    /sbin/reboot
    



Update 2012/03/07


В процессе тестирования обнаружились недочеты, которые сейчас устраняются.
Поэтому с установкой этого мода советую пока подождать.
Обсуждение на форуме http://forum.allnokia.ru/. Пожелания лучше постить сюда, что бы мне их было легче отслеживать. Если лень писать сюда, то постите в ветку форума.
После исправления ошибок и доработки соберу deb-пакет, чтобы не гемороиться с терминалом.


Update 2012/03/12


Увеличил кнопки в двух экранах. Обновленную версию опубликовал.



Update 2012/07/04


В связи с обновлением PR1.3 произвел ревизию и обновил мод и инструкцию.

пятница, 3 февраля 2012 г.

Ссылки Nokia N9

Документация

Форумы


Сайты, Порталы

Блоги

Приложения

Создание иконок on-line

Неофициальные репозитории, моды

суббота, 28 января 2012 г.

Прошивка Nokia N9 в Ubuntu 11.10

В процессе проведения экспериментов над моей Nokia N9 я превратил ее в черненький кирпичик, весело подмигивающий мне светодиодом.
Это значит, что пора осваивать перепрошивку.

Для прошивки Firmware под Ubuntu необходима утилита flasher.
Скачать ее можно отсюда: http://tablets-dev.nokia.com/maemo-dev-env-downloads.php
Для 64-битной версии я использовал flasher_3.12.1_amd64.deb
Firmware Nokia N9 64 GB: DFL61_HARMATTAN_20.2011.40-4_PR_LEGACY_001-OEM158_ARM.zip скачать и распаковать.


Перепрошивка выполняется так: $ sudo flasher -F DFL61_HARMATTAN_22011.40-4_PR_LEGACY_001-OEM1-958_ARM.bin -f flasher 3.12.1 (Oct 5 2011) Harmattan WARNING: This tool is intended for professional use only. Using it may result in permanently damaging your device or losing the warranty. Suitable USB interface (bootloader/phonet) not found, waiting... USB device found at bus 003, device address 033. Device identifier: 387330412376462 (SN: N/A) Found device RM-696, hardware revision 1501 NOLO version 2.1.5 Version of 'sw-release': DFL61_HARMATTAN_20.2011.40-4_PR_001 Sending ape-algo image (7032 kB)... 100% (7032 of 7032 kB, avg. 12104 kB/s) Suitable USB interface (phonet) not found, waiting... USB device found at bus 003, device address 034. Device identifier: 387330412376462 (SN: N/A) Raw data transfer EP found at EP2. Ping attempt 1 (250 ms) Server application: 1.6.3 Found product RM-696 rev. 1501 Server implements softupd protocol version 1.8 Image SW version DFL61_HARMATTAN_20.2011.40-4_PR_001 Image moslo not present Image mmc not present Image tar skipped Image config skipped Battery level 19 %, continuing. image [state progress transfer flash speed] --------------------------------------------------------------------- [x] cert-sw [finished 100 % 1 / 1 kB NA ] [x] cmt-2nd [finished 100 % 95 / 95 kB NA ] [x] cmt-algo [finished 100 % 789 / 789 kB NA ] [x] cmt-mcusw [finished 100 % 6050 / 6050 kB 2908 kB/s] [x] xloader [finished 100 % 23 / 23 kB NA ] [x] secondary [finished 100 % 93 / 93 kB NA ] [x] kernel [finished 100 % 2712 / 2712 kB 1859 kB/s] [x] rootfs [finished 100 % 1102340 / 1102340 kB 12547 kB/s] Updating SW release Success $ Область программ будет девственно чистой, как у нового аппарата. Контакты и почта останутся.


Полезные ссылки: