N9のカレンダヌフィヌド抂芁ず開発方法

この投皿は、「 Smart Posts for Smart Posts 」ずいうコンテストに参加しおいたす。



Nokia N9は、倚くの点で優れたデバむスです。 しかし、箱から出しおすぐには、非垞に重芁な機胜はありたせん。 携垯電話のホヌム画面を䞀目芋ただけでは、先のカレンダヌでどんなむベントが埅っおいるのかを理解するこずは䞍可胜です。 この厄介な問題を解決するために、私はCalendar Feedアプリケヌション OVI Store 、 source を開発したした。 カットの䞋で、アプリケヌション自䜓少しずそれがどのように䜜成されたか投皿の倧郚分に぀いお詳しく説明したす。



泚意、テキストがたくさんありたす。 準備ができたら...



カレンダヌフィヌドアプリケヌション。 これはOSに完党に統合されおおり、ナヌザヌではなくOSを介しお再床呌び出されたすただし、ナヌザヌは[曎新]ボタンを䜿甚しおアプリケヌションデヌタの曎新を急ぐこずができたす。 蚭定はシステムに完党に統合され、その䞀郚のように芋えたす。 動䜜䞭、アプリケヌションは定期的に20分ごず、叀いカレンダヌを削陀しながら、カレンダヌから最も近いむベントを持぀芁玠をフィヌドロシア語版ではチャンネルにアップロヌドしたす。 この芁玠は垞に䞀番䞊にありたすその時刻は珟圚のプラス1日ずしお蚭定されたす。 アプリケヌションにはいく぀かの蚭定がありたすがただ非垞に若く、少しだけ実行できたす、基本的な機胜のすべおの機胜には十分です。 芁玠内のむベントの数を蚭定しお、今日のむベントを将来今日があたりない堎合に远加するかしないか、将来のむベントの日数に制限切断の可胜性がある堎合を蚭定できたす翌幎たたは月のむベントを衚瀺しないように。

スクリヌンショット





さお、これはすべお歌詞であり、このアプリケヌションの実際の開発ほど興味深いものではありたせん。 最終的に、Habrは技術リ゜ヌスです。 それでは、これらすべおがどのように詳现に開発されたかを理解したしょう。



次のポむントが゜ヌトされたす。



免責事項

Harmattanのドキュメントは非垞に少なく、完党に茝くわけではないため、ここに曞かれおいる内容の倧郚分は、バむナリを入力しお掘るこずによっお把握する必芁がありたした。 おそらく、いく぀かのパスは最適ではありたせん。 この蚘事で説明されおいるこずを行う簡単な方法を知っおいる堎合は、コメントに曞いおください。



むベントを衚瀺する



アプリケヌションの最も重芁で基本的な機胜は、フィヌドに芁玠を远加するこずです。 2぀の方法がありたす



最埌のオプションに぀いおは怜蚎したせんが、最初の2぀に぀いおは怜蚎したす。



クラスMEventFeed


このオプションは、Harmattanのドキュメントで提案されおいたす。 圌はaのように単玔です。 2぀のメ゜ッドを持぀MEventFeedクラスがありたすオンラむンドキュメントによるず3぀のメ゜ッドがありたすが、3番目のメ゜ッドはQtSDKタヌゲットでは䜿甚できたせん addItemおよびremoveItemsBySourceName 。 最初のメ゜ッドはフィヌドに芁玠を远加し、2番目のメ゜ッドは同じ゜ヌスを持぀すべおの芁玠を削陀したす。

qlonglong addItem(const QString &icon, //  ( ) const QString &title, //  ( ) const QString &body, //    const QStringList &imageList, //  ,      (  Facebook') const QDateTime ×tamp, //   (      ) const QString &footer, //  ( ,   ) bool video, //      imageList    (          ,   ) const QUrl &url, // ,        const QString &sourceName, // Id  const QString &sourceDisplayName //   (      . ,     ) );
      
      





これを初めお芋たずき、私の顔は䌞びおいたした。 ゲッタヌずセッタヌで小さなクラスを䜜成しお枡すこずは本圓に䞍可胜ですか さお、わかりたした、䞎えられたもの、私たちはそれで働いおいたす。 コメントは、各パラメヌタヌの意味を瀺しおいたす。 このメ゜ッドは、芁玠のIDたたは-1を返したす䜕か問題が発生した堎合。ほずんどの堎合、これらは誀っお指定されたパラメヌタヌです。

 void removeItemsBySourceName(const QString &sourceName);
      
      





さお、ここではすべおが簡単です。 前のメ゜ッドで指定された同じIDを枡し、このIDを持぀すべおの芁玠が削陀されたす。



このパスは単玔で䟿利ですが、可胜性が制限されおいたす。 実際には、URLをナビゲヌトするこずに加えお、dbusメ゜ッドを呌び出すこずができたす。 ただし、このクラスの助けを借りお、呌び出されたメ゜ッドのシグネチャを指定するこずはできたせん。したがっお、より普遍的なフィヌドの操䜜方法dbus経由を怜蚎したす。



DBus


 QDBusMessage message = QDBusMessage::createMethodCall( "com.nokia.home.EventFeed", "/eventfeed", "com.nokia.home.EventFeed", "addItem"); QList<QVariant> args; QVariantMap itemArgs; itemArgs.insert("title", "Calendar"); itemArgs.insert("icon", icon); itemArgs.insert("body", body); itemArgs.insert("timestamp", QDateTime::currentDateTime().addDays(1).toString("yyyy-MM-dd hh:mm:ss")); itemArgs.insert("sourceName", "SyncFW-calendarfeed"); itemArgs.insert("sourceDisplayName", "Calendar Feed"); itemArgs.insert("action", action); QDBusConnection bus = QDBusConnection::sessionBus(); args.append(itemArgs); message.setArguments(args); bus.callWithCallback(message, this, SLOT(dbusRequestCompleted(QDBusMessage)));
      
      





ここにはさらにコヌドがありたすが、アクションプロパティを蚭定する機胜がありたすdbusメ゜ッドのシグネチャを栌玍したすが、これに぀いおは埌で詳しく説明したす。 MEventFeedにあったすべおのパラメヌタヌ、addItemおよびplus actionを蚭定できたす。 芚えおおくべき唯䞀のこずは、タむムスタンプの転送です。 "-- ::".



の圢匏で1行で送信され"-- ::".





アむコンぞのパスの代わりにアむコンを䜿甚しお、アむコンを䜿甚できたすカレンダヌフィヌドが䜿甚するものです。IDicon-l-calendar-12のアむコンが䜿甚されたす 。12の代わりにリストの最初のむベントの番号が眮き換えられたす。



たた、DBusを䜿甚するず、IDMEventFeedでは䜿甚できたせんでアむテムを削陀および曎新できたす。



Harmattan DBus眲名ストレヌゞ機胜


私はこのパズルを数晩倕方に解決しなければなりたせんでしたが、最終的に hexdump 、 stringsなど、およびそのような母芪を䜿甚しおメ゜ッドシグネチャを枡しお正しく呌び出されるようにする方法を理解するこずができたした。



次の眲名がありたす。

com.nokia.Calendar / com.nokia.maemo.meegotouch.CalendarInterface.showMonthView 2011 11 25

デバむスでこれらのパラメヌタヌを䜿甚しおこのメ​​゜ッドを呌び出すず、2011幎11月25日に遞択された日付の月衚瀺でカレンダヌが開きたす。



このメ゜ッドを呌び出すには、芁玠のアクションに次の行を远加する必芁がありたす。

com.nokia.Calendar / com.nokia.maemo.meegotouch.CalendarInterface showMonthView AAAAAgAAAAfb AAAAAgAAAAAL AAAAAgAAAAAZ



さお、むンタヌフェむスずメ゜ッド名の間にはスペヌスがあり、すべおが明確です。 QDBusMessageコンストラクタヌでは、 2぀の異なるパラメヌタヌにも分割されたす。 しかし、3぀の数字の代わりに3぀の奇劙な文字列匕数ずは䜕ですか あなたが知っおいるずき、すべおが非垞に簡単です、hehe倕方に2぀たたは3぀を殺し、バむナリずdbusメ゜ッドで掘り返したした。 これは、 QDataStreamにシリアル化されたQVariantオブゞェクトのBase64です。



そのような行を生成するためのヘルパヌメ゜ッド

 QString CalendarFeedPlugin::base64SerializedVariant(const QVariant &value) const { QByteArray ba; QDataStream stream(&ba, QIODevice::WriteOnly); stream << value; return ba.toBase64(); }
      
      





dbusメ゜ッドのシグネチャが栌玍されおいるHarmattanのあらゆる堎所で、このような衚蚘法が䜿甚されおいるこずが疑われたす。



Syncfw



フィヌド芁玠を䜜成する方法を孊びたした。 ここで、䜕らかの方法で定期的に远加する必芁がありたす。 バッテリヌを食べる悪魔を囲い蟌むのではなく、可胜な限りシステムに統合しお、い぀曎新するかを決定するこずをお勧めしたす。



この目的のために、Harmattanにはプラグむンを䜜成できるSyncFWフレヌムワヌクがありたす。 このプラグむンは、指定されたパラメヌタヌに埓っおポヌリングされたす。 プラグむンは、メタデヌタず共有ラむブラリの2぀の郚分に論理的に分割されおいたす。



重芁な点 PR1.0では、新しいプラグむンをむンストヌルした埌にデバむスを再起動する必芁がありたす。 PR1.1では、この問題を回避できたすむンストヌルスクリプトのセクションを参照。 ただし、プラグむンの曎新には垞に再起動が必芁です。 これがないず、叀いメタデヌタが新しいメタデヌタず共に䜿甚されるだけです再起動せずにアンロヌドできたすが、この方法はわかりたせん。



もう1぀の重芁なポむント䟋でcalendarfeed名が䜿甚されおいる堎合は垞に、プラグむン名が必芁であるこずが理解されおいたすこの堎合、ラむブラリはlib <plugin_name> -client.so、぀たり、この堎合はlibcalendarfeed-client.soず呌ばれたす。 プラグむンの名前にハむフンがあっおはなりたせん。 理想的には-ラテン文字のみ、数字の䜿甚も蚱可されるず思いたすチェックしたせんでした。



メタデヌタ


プラグむンを説明するには、次のファむルが必芁です。



/etc/sync/profiles/client/calendarfeed.xml

 <?xml version="1.0" encoding="UTF-8"?> <profile name="calendarfeed" type="client" > </profile>
      
      





クラむアント偎のプロファむルを䜜成するだけです共有ラむブラリがクラむアントずしお機胜したす



/etc/sync/profiles/service/calendarfeed.xml

 <?xml version="1.0" encoding="UTF-8"?> <profile name="calendarfeed" type="service"> <key name="destinationtype" value="offline"/> <profile name="calendarfeed" type="client" > </profile> </profile>
      
      





サヌビスプロファむルを䜜成し、オフラむンで動䜜できるこずを瀺したす。 ぀たり、プラグむンは正垞に機胜するためにむンタヌネット接続を必芁ずしたせんHarmattanのドキュメントではこれは䞍可胜であるず蚘茉されおいたすが、実際には機胜しおいたす。 顧客プロファむルも瀺されたす。



/etc/sync/profiles/sync/calendarfeed.xml

 <?xml version="1.0" encoding="UTF-8"?> <profile name="calendarfeed" type="sync" > <key name="displayname" value="Calendar Feed"/> <key name="enabled" value="true" /> <key name="use_accounts" value="false" /> <key name="hidden" value="true" /> <profile type="service" name="calendarfeed" > </profile> <schedule enabled="true" interval="20" days="1,2,3,4,5,6,7" syncconfiguredtime="" time=""> </schedule> </profile>
      
      





同期プロファむルを䜜成したす。 プロファむルノヌドのコンテンツ



ここで最も重芁な郚分は、もちろんスケゞュヌルです。 このノヌドからの情報に埓っお、プラグむンがポヌリングされたす。 この堎合、曜日に関係なく20分ごずに質問されたす。



しかし、週末ず平日の倕方には30分ごずに、平日は15分ごずに1回質問する必芁がある堎合はどうすればよいでしょうか 30分で明らかです。 20から30に倉曎するず、すべお問題ありたせん。 远加のスケゞュヌル時間を蚭定するには、 ラッシュノヌドをスケゞュヌルサブノヌドずしお有効にする必芁がありたす。

 <rush begin="00:00:00" enabled="true" interval="15" end="17:00:00" days="1,2,3,4,5"/>
      
      







共有ラむブラリ


ラむブラリには、プラグむンを䜜成および削陀するために、1぀のButeo :: ClientPlugin䞋䜍クラスず2぀のextern関数が必芁です。

 class CalendarFeedPlugin : public Buteo::ClientPlugin { Q_OBJECT public: CalendarFeedPlugin( const QString &pluginName, const Buteo::SyncProfile &profile, Buteo::PluginCbInterface *cbInterface ); virtual ~CalendarFeedPlugin(); virtual bool init(); virtual bool uninit(); virtual bool startSync(); virtual void abortSync(Sync::SyncStatus status = Sync::SYNC_ABORTED); virtual Buteo::SyncResults getSyncResults() const; virtual bool cleanUp(); public slots: virtual void connectivityStateChanged( Sync::ConnectivityType type, bool state ); protected slots: void syncSuccess(); void syncFailed(); void updateFeed(); void dbusRequestCompleted(const QDBusMessage &reply); void dbusErrorOccured(const QDBusError &error, const QDBusMessage &message); private: void updateResults(const Buteo::SyncResults &results); QString base64SerializedVariant(const QVariant &value) const; Buteo::SyncResults m_results; }; extern "C" CalendarFeedPlugin* createPlugin( const QString& pluginName, const Buteo::SyncProfile &profile, Buteo::PluginCbInterface *cbInterface ); extern "C" void destroyPlugin( CalendarFeedPlugin *client );
      
      





このヘッダヌには、最䜎限必芁なクラスに近いクラスが含たれたす 保護されたスロットずプラむベヌトセクションが削陀された堎合、最小クラスになりたす。 それ以倖はすべお仮想メ゜ッドのオヌバヌラむドですほずんどの堎合、玔粋仮想。



仮想bool init;

これは最初に呌び出され、プラグむンがそれ自䜓を初期化できるかどうかを確認するために必芁です。 成功した堎合、trueを返し、プロセスはさらに進みたす。



仮想ブヌルuninit;

プラグむンがアンロヌドされる前に呌び出され、通垞はここでクリヌニングが行われたす。



仮想ブヌルstartSync;

このメ゜ッドは、曎新を開始できるかどうかを確認し、曎新を開始する必芁がありたす非同期で。 曎新の開始に成功した結果を返したす。



virtual void abortSyncSync :: SyncStatus status = Sync :: SYNC_ABORTED;

ナヌザヌが曎新をキャンセルしたずきに呌び出されたす。 アカりントこのようなボタンがある堎合を操䜜する必芁がありたす。この堎合、ナヌザヌは曎新をキャンセルする機䌚がありたせん。



virtual Buteo :: SyncResults getSyncResultsconst;

最埌の曎新の結果を返したす。



仮想ブヌルのクリヌンアップ;

アカりントが削陀されたずきに呌び出されたす。 この堎合も、これは必芁ありたせんただし、ドキュメントでは、埌で䜿甚できる可胜性があるず曞かれおいたす。



virtual void connectivityStateChangedSync :: ConnectivityType type、bool state;

接続ステヌタスが倉曎された堎合に呌び出されたす。 プラグむンがネットワヌクで動䜜しない堎合、このスロットも空になりたす。



最も興味深いメ゜ッドはstartSyncであるこずがわかりたす。 そしお圓然です。 その䞭で、タむマヌに぀たり、非同期で芁玠をFeedに远加するメ゜ッドを実行したす。 他のすべおの方法はほずんどが実甚的です。



SyncFWプラグむンのロヌカラむズ


圓然、この小さなラむブラリはロヌカラむズに぀いお䜕も知りたせん。 そのため、目的の堎所で手動で突く必芁がありたす蚀語が自動的に遞択したす。䞻なこずは、目的の.qmファむルのセットを指定するこずです。

 MLocale locale; locale.installTrCatalog("calendarfeed"); //... itemArgs.insert("title", locale.translate("", "calendar_feed_item_title"));
      
      







曎新ボタンの曎新


むンタヌネットなしで曎新する堎合ず同様に、ドキュメントでは、曎新ボタンは埋め蟌みアプリケヌションのみを曎新できるこずが瀺されおいたす読み取りTwitter、Facebook、RSSフィヌド、APモバむル。 しかし、私たちは独自の方法で進んでいるので、このステヌトメントを自分で怜蚌しようずしたす。



Feedデヌタベヌス /home/user/.config/meegotouchhome-nokia/eventsfeed.dataファむルにあり、通垞のSqliteデヌタベヌスには、むベント、画像、refreshactionsの3぀のテヌブルがありたす。 この堎合、最初の2぀はほずんど関心がありたせんが、3番目は非垞に興味深いものです。 圌女には属性アクションが 1぀しかありたせん。 Feed芁玠を远加するこずで名前がすでによく知られおいるので、ここでdbusメ゜ッド呌び出しのシグネチャを䞊蚘の圢匏で配眮しようずしたす。 そしおそれは動䜜したす ドキュメントは再び間違っおいたした。 さお、倧䞈倫ですが、今では必芁な機胜を実装できたす。 システムぞの最倧限の統合の道をたどっおいたすが、アプリケヌションがこのボタンに応答しない堎合は非垞に奇劙です。



さお、ボタンにバむンドする方法を決定したしたが、プラグむンをスケゞュヌル倖で呌び出す方法は これを行うには、1぀の匕数クラむアントプロファむルの名前を持぀dbusメ゜ッドcom.meego.msyncd / synchronizer com.meego.msyncd.startSyncがありたす。



现かい郚分が残っおいたす...アクションをこのテヌブルに远加する方法は 実際、SQLク゚リではありたせん。 幞いなこずに、dbusのaddItemの隣にはaddRefreshActionメ゜ッドがあり、眲名付きの行を枡すこずができたす。



少し埌に、 からaddRefreshActionを呌び出す堎所を芋぀けたす。 それたでの間、アプリケヌション自䜓を続行したす。



カスタマむズ甚アプレット



アプリケヌションの蚭定が必芁です。 論理的な質問は、それらをどこに眮くか 別のアプリケヌションにしお、他のアプリケヌションの隣に配眮したすか いいえ、オプションではありたせん。 ランチャヌにはそれらが倚すぎたす。 非垞にたれにしか䜿甚されない別の曎新プログラム曎新ごずに玄1回は、明らかに䞍芁です。 この堎合、アプレットを蚭定階局に远加する機䌚が圹立ちたす。 たた、画面に䜙分なアむコンはありたせん。フィヌドでTwitterずFacebookの衚瀺を有効/無効にする暪に呌び出しボタンを远加できたす。



アプレット䜜成


MeeGo Harmattanは、蚭定で有効にできるアプレットを䜜成する3぀の方法を提䟛したす。



3番目のオプションは、蚭定からアプリケヌションに切り替えるずきに遅延を匕き起こす可胜性があるため、たったく適切ではありたせんたた、ドキュメントではお勧めできたせん。

2番目のオプションは最も柔軟ですが、最初のオプションよりも耇雑です。

最初のオプションは最小限の柔軟性ですが、同時に可胜な限りシンプルです。



特に耇雑な蚭定は必芁ないため、最初の方法を䜿甚したす。



それには2぀のファむルが必芁です。



それらを順番に分析したす。



/usr/share/duicontrolpanel/desktops/calendarfeed.desktop

 [Desktop Entry] Type=ControlPanelApplet Name=Calendar Feed X-logical-id=calendar_feed_title X-translation-catalog=calendarfeed Icon= X-Maemo-Service=com.nokia.DuiControlPanel X-Maemo-Method=com.nokia.DuiControlPanelIf.appletPage X-Maemo-Object-Path=/ # this has to be identical to the value in Name X-Maemo-Fixed-Args=Calendar Feed [DUI] X-DUIApplet-Applet=libdeclarative.so [DCP] Category=Events Feed Order=100 Part=calendarfeed.xml Text2=Calendar events at Feed screen Text2-logical-id=calendar_feed_subtitle
      
      





最初のセクションは暙準です。 X-Maemo- *パラメヌタヌに加えお、このアプレットを開くために呌び出すdbusメ゜ッドず呌び出す匕数を蚘述しない限り。



DUIセクションでは、共有ラむブラリの接続方法に぀いお説明したす。 私たちの堎合宣蚀アプレットは、垞にlibdeclarative.soです。 バむナリアプレットの堎合、DcpAppletIfの子孫を持぀共有ラむブラリ名はここにありたす。



DCPセクションには、挿入する堎所、堎所、および内容に関する情報が含たれおいたす。 この堎合、むベントフィヌドの蚭定に入りたすTwitterずFacebookのスむッチず同じ堎所。 Text2は2行目です通垞、説明たたはアむテムの珟圚の状態が衚瀺されたす。



/usr/share/duicontrolpanel/uidescriptions/calendarfeed.xml

 <settings> <group title="calendar_feed_setting_group_behavior"> <boolean key="/apps/ControlPanel/CalendarFeed/EnableFeed" title="calendar_feed_setting_publish_to_feed"></boolean> <boolean key="/apps/ControlPanel/CalendarFeed/FillWithFuture" title="calendar_feed_setting_fill_with_future"></boolean> <boolean key="/apps/ControlPanel/CalendarFeed/LimitFuture" title="calendar_feed_setting_limit_future"></boolean> <integer key="/apps/ControlPanel/CalendarFeed/LimitDaysSize" title="calendar_feed_setting_future_limit_size" min="1" max="31"></integer> </group> <group title="calendar_feed_setting_group_display"> <integer key="/apps/ControlPanel/CalendarFeed/FeedSize" title="calendar_feed_setting_events_number" min="1" max="5"></integer> <boolean key="/apps/ControlPanel/CalendarFeed/ShowCalendarBar" title="calendar_feed_setting_show_calendar_bar"></boolean> <text key="/apps/ControlPanel/CalendarFeed/DateFormat" title="calendar_feed_setting_date_format">MMM, d</text> <boolean key="/apps/ControlPanel/CalendarFeed/HighlightToday" title="calendar_feed_setting_highlight_today"></boolean> </group> </settings>
      
      





笑いたすが、この䟋では、宣蚀型アプレットに含たれるノヌドを陀くすべおのタむプのノヌドをリストしたす。



すべおのタむプのノヌドに぀いお、2぀のパラメヌタヌが暙準です。



はい サプラむズサプラむズ Qt-shny MeeGo HarmattanはすべおGConfを䜿甚しお内郚蚭定を保存したす。 ずころで、バックアップに入るのはGConfの蚭定です。



グルヌプ -䞀皮のグルヌプボックスの圹割を実行したす2番目のスクリヌンショットの衚瀺䟋。動䜜ず倖芳の2぀のグルヌプがありたす。 ドキュメントにはパラメヌタヌがないず蚘茉されおいたすが、それでもタむトルは正垞に機胜したす。

ブヌル -スむッチ。 最も普通の...

æ•Žæ•° -敎数倀を遞択するためのスラむダヌ。 暙準に加えお、minずmaxの2぀のパラメヌタヌがありたす。 スラむダヌの範囲を蚘述したす。

テキスト -テキストを入力するためのフィヌルド。 ちなみに、このタむプの堎合、タむトルはドキュメントでも宣蚀されおいたせんが、それが機胜するこずはすでにわかっおいるず思いたす。

遞択 -ボタンのグルヌプ。各ボタンは、1぀のパラメヌタヌを持぀サブオプションで蚘述されたす-キヌ。この堎合、UIに衚瀺される倀の圹割を果たしたす。 各オプションには、番号付きのテキストが必芁ですGConfに保存されたす。



GConfItemを䜿甚する


GConfが䜿甚されおいたすが、それでもGConfを操䜜するためのQtクラス-GConfItemがありたす。 それから2぀のメ゜ッドが必芁です valueずset 最初はQVariantのパラメヌタヌの倀を返し、2番目はパラメヌタヌの倀を倉曎したす。



ただし、すべおのタむプがサポヌトされおいるわけではありたせん。 次のルヌルが適甚されたすgconfおよびqvariant機胜による



宣蚀型アプレットの堎合、アプレットは文字列、ブヌル倀、敎数を提䟛するため、これは完党に適しおいたす。

GConfItemの䟋

 bool fillWithFuture = false; GConfItem fillConfItem("/apps/ControlPanel/CalendarFeed/FillWithFuture"); QVariant fillVariant = fillConfItem.value(); if (fillVariant.isValid()) fillWithFuture = fillVariant.toBool(); else fillConfItem.set(false);
      
      







カレンダヌデヌタの読み取り



実際、アプリケヌションの最も重芁な郚分です。 最埌に、そこからむベントをもたらしたす。 理論的には、すべおがQt Mobilityを介しお機胜し、完党にたたはそれに近い状態で機胜する必芁がありたす。 結局のずころ、MeeGoはコアでQtを䜿甚しおいたす。 n9をリリヌスしたNokiaは、本質的にQtの所有者です。 すべおを可胜な限り統合する必芁がありたすか シュシャッツ、ええ。 い぀ものように、ここには豚が怍えられおいたす。 しかし、実際にはこれず投皿のために。 将来の䞖代のためにこれらの豚を蚘述するこず。



終日むベント


カレンダヌには、終日぀たり、時間なしのむベントを蚭定する機胜がありたす。 QOrganizerには、むベントのallDayパラメヌタヌもありたす。 これは垞に停です。 カレンダヌに衚瀺されるものに関係なく。 Vagueは、逆のこずが真実であるずいう苊痛を掚枬したす぀たり、QOrganizerを介しおallDayむベントを䜜成するず、カレンダヌに䜕か問題が発生したす。 それでも、むベントがallDayであるかどうかを刀断するためのヒュヌリスティックな方法がありたす。

 if (!isAllDay && startDateTime.time().hour() == 0 && startDateTime.time().minute() == 0 && endDateTime.time().hour() == 0 && endDateTime.time().minute() == 0 && startDateTime.date().addDays(1) == endDateTime.date()) isAllDay = true;
      
      







ToDoアむテム


QOrganizerは、ToDo芁玠があるこずを知っおいたす。 圌はそれらの終了日も保存したす。 それだけでは、ToDoが完了しおいるかどうかを刀断するこずは䞍可胜です。 それは䞍可胜です。 QOrganizer自䜓にはこのようなフラグがありたすが、QOrganizerが基瀎ずなるレベルからデヌタを受け取ったずきにコックされたせん。 前の問題ずは異なり、Qt Mobilityによる解決策はありたせん。 そしお、少なくずもQtMobility経由ではないようです少なくずも次のファヌムりェアたで。



タむムゟヌン


芋぀かった最初の2぀のゞャムに加えお、3番目も発芋されたした。 もっず楜しくお゚キゟチック。 ポむントです。 カレンダヌがシステムに保存されるデヌタ構造には、むベントがどのタむムゟヌンで蚘録されるフィヌルドがありたす。 ぀たり、「開始日」フィヌルドに同じ倀を持぀2぀のむベントがある堎合、それらが同時に開始するずいう事実ではありたせん。 時間を正しく刀断するには、䞡方のフィヌルドが必芁です。 したがっお、UTCで䜜成された゚クスポヌトされたカレンダヌを䜿甚する堎合、たたはCalDAVによっお同期される共通のカレンダヌを䜿甚し、異なるタむムゟヌンのナヌザヌがそれを䜿甚する堎合、誀った時間が衚瀺されたす。



カレンダヌシステムは、2぀のレベル高および䜎で構築されおいたす。 QtMobilityはQOrganizerモゞュヌルず䞀緒に䜿甚できたす。QOrganizerモゞュヌルは䜿いやすいですが、䞊蚘の珟象の圱響を受けたすタむムゟヌンを持぀フィヌルドの存圚を疑うだけではありたせん。 䜎い䜍眮にあるmKCalは、垞に正しいデヌタを返したすが、䜿甚するにはあたり䟿利ではありたせん。



カレンダヌフィヌドは、もずもずQOrganizerを䜿甚しお䜜成されたした。しかし、1぀のバグ重倧、䞀郚の゚キゟチックなケヌスでの時間の誀った衚瀺に関連するの​​出珟埌、ある皮の移行期間が始たりたした。珟時点では、プロゞェクトは䞡方のレベルを䜿甚しおいたす。最初に、すべおのむベントがQOrganizerを介しお収集され、次に、mKCalを介しお収集されたむベントに応じお、日付の極端な境界がプロットされたす。正しいデヌタは、埌者から取埗されたす個別のデヌタ構造で。その埌、サむクルが最初に進み、必芁に応じおデヌタが眮き換えられたす。



おそらく、前の段萜を読んだ埌、すぐに質問が珟れたした。すぐにmKCalに切り替える方が簡単ではありたせんか」実際、私は移行を考えおいたす。しかし、このバグは非垞に重く、すぐに修正する必芁がありたした。䞻な機胜を実装する完党に新しいシステムぞの移行には、2床考えられるようなバグがたくさんありたす。したがっお、二重の解決策を備えた緊急の修正プログラムを発行するこずを決定し、冷静に、すべおの長所ず短所を比范怜蚎し、新しいシステムに切り替えたした。



ずころで、mKCalこれは論理的ですには、最初の2぀の珟象に関する正しい情報がありたす。



プロゞェクトファむルずその他の雑孊



そこで、実装メカニズムを芋぀けたした。すべおをたずめるこずは残っおいたす。たず、.proファむルを芋おください

 TEMPLATE = lib TARGET = calendarfeed-client VERSION = 0.3.0 DEPENDPATH += . INCLUDEPATH += . \ /usr/include/libsynccommon \ /usr/include/libsyncprofile \ /usr/include/gq \ /usr/include/mkcal \ /usr/include/kcalcoren LIBS += -lsyncpluginmgr -lsyncprofile -lgq-gconf -lmkcal CONFIG += debug plugin meegotouchevents CONFIG += mobility MOBILITY += organizer QT += dbus #input SOURCES += \ calendarfeedplugin.cpp HEADERS +=\ calendarfeedplugin.h QMAKE_CXXFLAGS = -Wall \ -g \ -Wno-cast-align \ -O2 -finline-functions #install target.path = /usr/lib/sync/ system ("cd translations && lrelease -markuntranslated '' -idbased *.ts") client.path = /etc/sync/profiles/client client.files = xml/calendarfeed.xml sync.path = /etc/sync/profiles/sync sync.files = xml/sync/calendarfeed.xml service.path = /etc/sync/profiles/service service.files = xml/service/calendarfeed.xml settingsdesktop.path = /usr/share/duicontrolpanel/desktops settingsdesktop.files = settings/calendarfeed.desktop settingsxml.path = /usr/share/duicontrolpanel/uidescriptions settingsxml.files = settings/calendarfeed.xml translations.path = /usr/share/l10n/meegotouch translations.files += translations/*qm INSTALLS += target client sync service settingsdesktop settingsxml translations OTHER_FILES += \ qtc_packaging/debian_harmattan/rules \ qtc_packaging/debian_harmattan/README \ qtc_packaging/debian_harmattan/manifest.aegis \ qtc_packaging/debian_harmattan/copyright \ qtc_packaging/debian_harmattan/control \ qtc_packaging/debian_harmattan/compat \ qtc_packaging/debian_harmattan/changelog \ qtc_packaging/debian_harmattan/postinst \ qtc_packaging/debian_harmattan/prerm
      
      





Calendarfeed-clientずいう名前SyncFWによるもので、共有ラむブラリSyncFWセクションから芚えおいるように、プラグむンはたさにそれである必芁がありたすを構築しおいたす。

必芁なすべおのシステムヘッダヌずラむブラリを接続したす。

接続meegotucheventsをするためにMEventFeed私たちはDBUSを経由しお远加し、それでも陀去方法の呌び出しに残されたすが。

远加qdbusず移動床は、䞻催者の流れだけでなく、どのような私たちのヘッダず゜ヌスファむルを指摘しおいたす。

これたでのずころ、すべおが暙準です。



むンストヌルコメントの埌のすべおの最も重芁な。

すべおのxmlおよびデスクトップを必芁なフォルダヌ蚘事の察応するセクションに瀺されおいるに配眮し、そのフォルダヌにロヌカラむズを配眮したす/ usr /このコンテンツ共有/ L10N / meegotouch。この堎合、ファむルはcalendarfeed_ru.qmの圢匏である必芁がありたす。ここで、calendarfeedは、デスクトップファむルのX-translation-catalogパラメヌタヌで指定されたものです。



むンストヌルスクリプト


SyncFWプラグむンには興味深い機胜が1぀ありたす。圌ら自身は、正しくむンストヌルおよび削陀する方法を知りたせん。再起動が必芁です。さらに、削陀するずきはフィヌドからアむテムを削陀する必芁がありたす。たた、むンストヌル時にも曎新ボタンが機胜するように、refreshActionを远加するず䟿利です。



debパッケヌゞに远加できるこのための2぀のスクリプトがありたす。





postinst

 #!/bin/sh /usr/bin/aegis-exec -s -u user dbus-send --dest=com.meego.msyncd --print-reply /synchronizer com.meego.msyncd.installPlugin string:'calendarfeed' /usr/bin/aegis-exec -s -u user dbus-send --dest=com.nokia.home.EventFeed --print-reply /eventfeed com.nokia.home.EventFeed.addRefreshAction string:'com.meego.msyncd /synchronizer com.meego.msyncd startSync AAAACgAAAAAYAGMAYQBsAGUAbgBkAGEAcgBmAGUAZQBk' gconftool -s /apps/ControlPanel/CalendarFeed/EnableFeed -t bool true /usr/bin/aegis-exec -s -u user dbus-send --dest=com.meego.msyncd --print-reply /synchronizer com.meego.msyncd.startSync string:'calendarfeed' exit 0
      
      





ここでは、プラグむンをむンストヌルしPR1.1でのみ機胜し、PR1.0ではデバむスを再起動する必芁がありたす、refreshActionを远加し、アプリケヌションをオンにしおFeedのアむテムを手動で曎新するず明瀺的に蚀いたす。



予蚀

 #!/bin/sh /usr/bin/aegis-exec -s -u user dbus-send --dest=com.meego.msyncd --print-reply /synchronizer com.meego.msyncd.uninstallPlugin string:'calendarfeed' /usr/bin/aegis-exec -s -u user dbus-send --dest=com.nokia.home.EventFeed --print-reply /eventfeed com.nokia.home.EventFeed.removeItemsBySourceName string:'SyncFW-calendarfeed' exit 0
      
      





フィヌドからプラグむンず芁玠を削陀したす。



ちなみに、指定されたプラグむンのむンストヌル方法は最初のむンストヌルには圹立ちたすが、共有ラむブラリを曎新する堎合、リブヌト前に叀いラむブラリが匕き続き䜿甚されたすメモリからアンロヌドされたせん。デバッグ䞭に䞍䟿な点がありたす。



おわりに



はい蚘事は぀いに終わりたした。私はそれを曞くのにうんざりしおおり、あなたはそれを読むのに少しうんざりしおいるず思いたす。しかし、この蚘事のおかげで、次のこずを孊びたした。



実際、もちろん、この投皿には、開発䞭に出䌚ったすべおのものを含めたせんでした。そしお、すべおが詳现に説明されおいるわけではなく、この投皿はすでに長すぎたす。私の目暙は、これがどのように行われるかを瀺すこずであり、理論的な情報やこの情報ぞの道を瀺すこずではありたせんでした。しかし、この情報も興味深い堎合は、私のブログでこのアプリケヌションの開発䞭にいく぀かの「旅行メモ」を読むこずができたすプロファむル内のリンク。



そしお最埌に、リンクの束



あなたが興味を持っおいたず思いたす。以䞊です



All Articles