以下、図面に基づき本発明の実施形態について説明する。
<システム全体構成>
図1は、本実施形態における画像処理装置を含む画像処理システムの構成ブロック図である。画像処理システムは、端末装置10及び画像処理装置12を備える。端末装置10と画像処理装置12は、通信手段14を介して接続される。通信手段14は、例えばLAN(ローカルエリアネットワーク)等のデータ通信ネットワークが用いられる。
端末装置10は、通信手段14を介して画像処理装置12に接続され、利用者の指示に従い、文書の印刷命令を含む印刷ジョブ等を送信する。
画像処理装置12は、ROM16、RAM18、HDD20、1つ又は複数のCPUで構成される制御部22、入出力インターフェイスI/F24、タッチパネル等の操作部26、画像処理部28を備える。
1又は複数のCPUで構成される制御部22は、ROM16に記憶された処理プログラムに従い、入出力インターフェイスI/F24を介して端末装置10から印刷ジョブ命令等を受け付け、PDLデータを解釈して中間データを生成し、生成した中間データからさらに描画データ(ラスターデータ)を生成する。また、制御部22は、操作部26から受け付けたコピー(Copy)、スキャン(Scan)、ファクス(Fax)等の各種命令を実行する。
画像処理部28は、プリントモジュール、スキャナモジュール、ファクスモジュール、用紙給紙モジュール、原稿給紙モジュール、及び画像処理アクセラレータを備える。
プリントモジュールは、画像を用紙に出力する機能を有するモジュールである。例えば、公知のインクジェット方式の構成を備え、描画データを用紙に印刷する。ノズル等から液体あるいは溶融固体インクを吐出し、紙、フィルム等に記録を行う。インクを吐出する方法には、静電誘引力を利用してインクを吐出させるドロップオンデマンド方式(圧力パルス方式)、高熱により気泡を形成・成長させることで生じる圧力を利用してインクを吐出させる熱インクジェット方式等がある。記録ヘッドは、例えば、シアンインクを吐出するヘッド、マゼンタインクを吐出するヘッド、イエローインクを吐出するヘッド、ブラックインクを吐出するヘッドを備え、各ヘッドが用紙の幅と少なくとも同等の幅を有するラインヘッドが用いられる。記録ヘッドにより各色のインク滴を中間転写体に吐出して記録し、その後に用紙に転写して印刷する。
スキャナモジュールは、用紙から画像を読み取って電子データに変換するモジュールである。
ファクス(Fax)モジュールは、モデムやファクス用画像処理モジュールを備え、ファクス機能を実行するモジュールである。
用紙給紙モジュールは、用紙トレイからプリントモジュールに用紙を搬送するモジュールである。
原稿給紙モジュールは、原稿トレイからスキャナモジュールに用紙を搬送するモジュールである。
画像処理アクセラレータは、スキャナモジュール等と連動して圧縮/伸長処理を行うモジュールである。この画像処理アクセラレータは必須ではなく、付加的モジュールとしてもよい。
なお、画像処理装置12は、これら以外にも、用紙のパンチやソート等を行うフィニッシャ、USB、ICカードリーダ等から構成され利用者の認証を行う認証部、課金部、人感センサや顔カメラ等を備えていてもよい。
また、画像処理装置12は、通信手段14を介してインターネットに接続されていてもよく、イーサネット(登録商標)やWi−Fi(登録商標)を備えていてもよい。
<プログラムの論理構成>
図2は、制御部22で実行されるシステムの論理構成を示す。システムは、大別して、プレゼンテーション層30とデバイスサービス層32の2つの層に分離される。
プレゼンテーション層30は、各種アプリケーションを実装する層であり、フレームワーク31と、各種アプリケーションを含む。フレームワーク31は、コンピュータシステム上でJavaScript(登録商標)アプリケーションを動かせるようにする実行環境ソフトウェア群である。より具体的には、JavaScriptは、Webブラウザ上で実行され、Base FrameとUI FrameはHTMLのiframeとしてロードする。また、アプリケーションは、フレームワーク31が提供するI/Fを実装したJavaScriptソフトウェアである。フレームワーク31は、各種アプリケーションのライフサイクルを管理する。すなわち、フレームワーク31は、各種アプリケーションに対して、ベースフレーム(Base Frame)を作成して各種アプリケーションのコアロジック(Core Logic)を読み込み、コアロジック(Core Logic)に対してイニシャライズ(初期化)を指示する。また、システム終了時には、各種アプリケーションのコアロジック(Core Logic)に対してファイナライズを指示し、ベースフレーム(Base Frame)を破棄する。各種アプリケーションのコアロジック(Core Logic)及びライフサイクル管理については、さらに後述する。
デバイスサービス層32は、各種ハードウェアデバイスを管理する層であり、各種ハードウェアデバイスには、上記の画像処理部28のプリントモジュール等が含まれる。
図3は、画像処理装置12の操作部26に表示される画面(ホーム画面)の一例を示す。ホーム画面には、コピー(Copy)ボタン34,IDカードコピー(ID Copy)ボタン36、スキャン(Scan)ボタン38、ファクス(Fax)ボタン40、マイコピー(MyCopy)ボタン42、ウェブアプリ(Web App1)ボタン44,簡単コピーボタン46の各アイコンが表示される。利用者がいずれかのボタンにタッチして選択すると、各ボタンに割り当てられたアプリケーションが起動し、アプリケーションの画面に遷移する。利用者は、各ボタンに各アプリケーションが対応していると認識し得る。
アプリケ−ションは、既述したように、フレームワーク31が定義したI/Fを提供するJavaScriptソフトウェアであり、利用者に対して直接的に機能を提供するコンポーネントである。フレームワーク31によって定義された共通の構成を有する。また、各アプリケーションは、他のアプリケーションとの間の結合度合いが低くなるように構成される。アプリケーションには、ユーザインターフェイス(UI)を介して利用者と協働して動作するものと、利用者と協働しないものがある。利用者と協働するアプリケーションは、主体的にプレゼンテーション層30を通じて表示や入力を実行する。
なお、図には利用者がログインするためのログイン(Login)ボタン48も表示されているが、このボタンにもアプリケーションが対応している。
<アプリケーションの実装構造>
図4は、アプリケーションの構造を示す。アプリケーション50は、大別して、3つのコンポーネントに分離される。すなわち、コアロジック(Core Logic)52、UIフレーム(UI Frame)54、及びマニフェストファイル(Manifest file)56に分離される。ここで、「分離」とは、物理的に分離されることを意味するものではなく、論理的に分離されることを意味する。
コアロジック(Core Logic)52は、アプリケーションとしての基本処理(基本的な振る舞いやアプリ間連携)を行うコンポーネントであり、各アプリケーションに必ず存在する。コアロジック(Core Logic)は、フレームワーク31によって定義されたI/Fを提供する。
UIフレーム(UI Frame)54は、アプリケーションとして描画表示するためのコンポーネントであり、具体的には表示ウインドウとして管理される。
マニフェストファイル56は、各アプリケーションの静的な情報のリストである。静的な情報は、アプリケーションの識別子(ID)、表示名称、アイコン画像、バージョン、作成日等である。マニフェストファイル56には、コアロジック用マニフェストファイル56−1と、UIフレーム用マニフェストファイル56−2がある。マニフェストファイル56が記述する情報の一つは、isLaunchable属性である。この属性により、ホーム画面上にアイコン(ボタン)として表示されるか否かが決定され、
isLaunchable=trueで表示
isLaunchable=falseで非表示
となる。
このような構成において、コアロジック(Core Logic)52とUIフレーム(UI Frame)54との間の通信のルールは以下の通りである。
(1)コアロジック(Core Logic)52は、他のコアロジック(Core Logic)52と通信する。
(2)UIフレーム(UI Frame)54は、コアロジック(Core Logic)52のみと通信する。
従って、UIフレーム(UI Frame)54は、他のUIフレーム(UI Frame)54と通信することはない。
図5は、従来のプログラム構成を示す。従来においては、巨大なルートアプリケーション(RootApp)60を用意して各アプリケーションから利用される種々の機能を提供しており、全てのアプリケーションはこのルートアプリケーション60に依存している。また、各種のデバイス状態を専門に扱うデバイスアプリケーション(Device App)62も別個に存在しており、ほぼ全てのアプリケーションがこのデバイスアプリケーション62に依存している。さらに、アプリケーション間での実装共通化が進んでおり、アプリケーション間での依存関係も生じている。従って、アプリケーションを追加する場合や削除する場合でも、その都度アプリケーション間で調整が必要となり、また、ルートアプリケーション60の修正も常に必要となることから、容易にアプリケーションの追加や削除ができない。
他方、図6は、本実施形態のプログラム構成を示す。各アプリケーションは、コアロジック(Core Logic)52、UIフレーム(UI Frame)54、及びマニフェストファイル(Manifest file)56に分離されており、各アプリケーションのコアロジック(Core Logic)52がフレームワーク31に接続され、各アプリケーションのUIフレーム(UI Frame)54は当該アプリケーションのコアロジック(Core Logic)52に接続される構成である。
例えば、コピー(Copy)アプリケーションを例にとると、コピーアプリケーションは、コアロジック(Core Logic)52、UIフレーム(UI Frame)54、及びマニフェストファイル(Manifest file)56に分離され、そのコアロジック(Core Logic)52はフレームワーク31に接続され、そのUIフレーム(UI Frame)54はそのコアロジック(Core Logic)52に接続される。各アプリケーション間の結合は限定的であって従来のように依存関係になく、各アプリケーション間の連携は、コアロジック(Core Logic)52を介してフレームワーク31により実行される。各アプリケーションのコアロジック(Core Logic)52は、フレームワーク31によって定義されたI/Fを提供するから、新たにアプリケーションを追加する場合でも、フレームワーク31によって定義されたI/Fを提供することで容易に追加できる。また、アプリケーション間の結合も限定的であるため、アプリケーションの削除も容易である。
図7は、コピーアプリケーションの例を示す。図において、baseframe.htmlがコアロジック(Core Logic)52であり、base_manifest.jsonがコアロジック(Core Logic)52のマニフェストファイル56−1である。また、uiframe.htmlがUIフレーム(UI Frame)54であり、app_manifest.jsonがUIフレーム(UI Frame)54のマニフェストファイル56−2である。
図8は、アプリケーションリストの例を示す。図において、”base”がコアロジック(Core Logic)52のマニフェストファイル56−1を示し、”app”がUIフレーム(UI Frame)54のマニフェストファイル56−2を示す。マニフェストファイル56−2の中の”type”は、アプリケーションの種類を示す。アプリケーションの種類については以下の通りである。
すなわち、アプリケーションには、
STD:標準搭載されるアプリケーション
OT:標準搭載されるアプリケーション(STD)のショートカット
EXT:追加可能なアプリケーション(その1)
CS:追加可能なアプリケーション(その2)
の4つの種類がある。標準搭載されるアプリケーションは、図3に示されるコピー(Copy)やスキャン(Scan)、ファクス(Fax)等に対応するアプリケーションである。また、OT、EXT、CSの各アプリケーションには、それぞれ特別なコンパニオンアプリケーションが割り当てられ、各コンパニオンアプリケーションがそれぞれの機能を担う。各コンパニオンアプリケーションも、STDアプリケーションと同様にコアロジック(Core Logic)52を有する。マニフェストファイル56にアプリケーションの種類を含めることで、各アプリケーションの内部実装を互いに区別することができる。
また、マニフェストファイル56−2の中の”isLaunchable”は既述したように、アイコンをホーム画面上に表示するか否かを決定する属性情報である。図では、
isLaunchable=true
となっており、これはコピーのボタンを表示することを意味する。
アプリケーションは、コアロジック(Core Logic)52とUIフレーム(UI frame)54に分離されているから、アプリケーションリストは、両者の対応関係が記述されているということができる。
マニフェストファイル56は、アプリケーション毎に作成されるから、アプリケーション毎の種別を示す識別子と、種別内で一意の識別子を設定することが望ましい。例えば、コピーアプリケーションのマニフェストファイルには、
type:STD
ID:copy
等である。typeは種別を示す識別子であり(標準搭載されるアプリケーション)、IDは一意の識別子である。
さらに、マニフェストファイル56には、静的情報として、起動時に必要とされる情報及びホーム画面描画に必要な情報も含まれる。起動時に必要とされる情報は、コアロジック(Core Logic)52の格納先情報及びUIフレーム(UI frame)54の格納先情報であり、フレームワーク31はコアロジック(Core Logic)52の格納先情報を参照してコアロジック(Core Logic)52をロードする。また、コアロジック(Core Logic)52は、UIフレーム(UI frame)54の格納先情報を参照してUIフレーム(UI frame)54を必要に応じてロードする。
ホーム画面描画に必要とされる情報は、アイコンボタン格納先情報及びボタンの表示順序である。
マニフェストファイル56は、後述するようにデバイスサービス層のアプリケーション管理コンポ−ネントで参照され、アプリケーションリストの作成に供される。
図9は、アプリケーションの実装構造のパターンを示す。
図9(a)は、コアロジック(Core Logic)52は存在するが、UIフレーム(UI Frame)54が存在しないパターンである。標準搭載されるアプリケーションではなく、コンパニオンアプリケーション等が該当する。図9(d)は、図9(a)に対応するアプリケ−ションリストである。
図9(b)は、コアロジック(Core Logic)52及びUIフレーム(UI frame)54が存在するパターンであり、それぞれ1対1に対応するパターンである。図9(e)は、図9(b)に対応するアプリケーションリストである。
他方、図9(c)は、コアロジック(Core Logic)52及びUIフレーム(UI frame)54が存在するものの、複数のUIフレーム(UI Frame)54が共通のコアロジック(Core Logic)52を有する場合である。UIフレーム(UI Frame)54はホーム画面にボタンを表示する際の表示形態を決定するが、複数のボタンを表示する際にもそのコアロジック(Core Logic)52を共通化することで実装が効率化される。また、複数のアプリケーションでコアロジック(Core Logic)52を共通化することでメンテナンス性が向上する。コアロジック(Core Logic)52を共通に持つUIフレーム(UI Frame)54の数に制限はない。図9(f)は、図9(c)に対応するアプリケーションリストである。マニフェストファイル56−1の具体例は、例えば、
{
"id": "appId.std.copy",
"url": "app/copy/baseframe/baseframe.html"
}
であり、マニフェストファイル56−2の具体例は、例えば、
{
"subId": "copy",
"type": "STD",
"appUrl": "app/copy/copy/uiframe.html",
"isLaunchable": true,
"orderWeight": 100,
"largeIcon": "common/img/preset/app/app_copy_120.png",
"smallIcon": "common/img/preset/app/app_copy_48.png",
"displayName": "Copy",
"displayNameId": "001"
}
あるいは、
{
"subId": "idcopy",
"type": "STD",
"appUrl": "app/copy/idcopy/uiframe.html",
"isLaunchable": true,
"orderWeight": 900,
"largeIcon": "common/img/preset/app/app_idcardcopy_120.png",
"smallIcon": "common/img/preset/app/app_idcardcopy_48.png",
"displayName": "IDCardCopy",
"displayNameId": "002"
}
である。
なお、図9(b)及び図9(c)において、UIフレーム(UI Frame)54のマニフェストファイル56−2のisLaunchable属性値を設定することで、実際にホーム画面上にボタンを表示するか否かが決定される。例えば、図9(c)において、コアロジック(Core Logic)52を共通に持つ、第1のUIフレーム(UI Frame)54と第2のUIフレーム(UI Frame)54が存在し、第1のUIフレーム(UI Frame)54のマニフェストファイルのisLaunchable=trueであるのに対し、第2のUIフレーム(UI Frame)54のマニフェストファイルのisLaunchable=falseである場合、前者はボタンとして表示されるが後者は表示されない。
アプリケーションの実行構造として、コアロジック(Core Logic)52とUIフレーム(UI Frame)54を分離しているので、コアロジック(Core Logic)52を変更することなくUIフレーム(UI Frame)54のみを変更し、アプリケーションの画面上の表示形態を容易にカスタマイズすることが可能である。
図10は、画面上の表示形態をカスタマイズする場合の例を示す。
図10(a)は、当初の表示形態である。IDカードコピーのアプリケーションに着目すると、そのUIフレーム(UI Frame)54はidcopy/uiframe.htmlであり、そのマニフェストファイル56−2はidcopy/app_manifest.jsonである。
図10(b)は、表示形態をカスタマイズする場合である。IDコピーのアプリケーションにおいて、そのUIフレーム(UI frame)54とマニフェストファイル56−2を新しい表示形態用のidcopy_for_xxx/uiframe.htmlとidcopy_for_xxx/app_manifest.jsonに入れ替える。勿論、マニフェストファイル56−2のみを入れ替えることも可能である。
他方、図10(c)は、表示形態ではなくアプリケーションのロジックを変更する場合である。この場合には、コアロジック(Core Logic)52、UIフレーム(UI Frame)54、マニフェストファイル56を全て新しいものに入れ替える。すなわち、copy以下をcopy_for_xxxに入れ替える。
図11は、フレームワーク31を含めた具体的なアプリケーションの実装構造のパターンを示す。
図11(a)は、コピーアプリケーションとIDコピーアプリケーションを実装する場合のパターンの例である。コピーアプリケーションは、コアロジック(Core Logic)52とUIフレーム(UI frame)54に分離され、コアロジック(Core Logic)52がフレームワーク31と通信する。UIフレーム(UI frame)54はコアロジック(Core Logic)52のみと通信する。また、IDコピーも同様にコアロジック(Core Logic)52とUIフレーム(UI frame)54に分離され、コアロジック(Core Logic)52がフレームワーク31と通信する。UIフレーム(UI frame)54はコアロジック(Core Logic)52のみと通信する。
図11(b)は、コピーアプリケーションとIDコピーアプリケーションに加え、プリントアプリケーションを実装する場合の他の例である。コピーアプリケーションとIDコピーアプリケーションは、共通のコアロジック(Core Logic)52とそれぞれのUIフレーム(UI frame)54に分離される。すなわち、コピーアプリケーション及びIDコピーアプリケーションは、共通のコアロジック(Core Logic)52を介してフレームワーク31と通信する。また、プリントアプリケーションは、コアロジック(Core Logic)52は存在するもののUIフレーム(UI frame)54はない。図11には、図9に示す全てのパターンが含まれている。
従来のアプリケーション実装構造では、このようにコアロジック(Core Logic)52とUIフレーム(UI frame)54とが分離しておらず、処理と画面描画とが混在して分かり難い構造であった。また、アプリケーションの共通I/Fも存在せず、各アプリケーションはいわば勝手にI/Fを公開し、勝手にこれを参照していた。これに対し、実施形態では、フレームワーク31がアプリケーションI/Fとして定義し、各アプリケーションのコアロジック(Core Logic)52がこのアプリケーションI/Fを必ず実装する構造であるため、従来とはI/Fの向きが相違するといえる。また、フレームワーク31とアプリケーション間の通信のみならず、アプリケーション間の通信I/Fについてもフレームワーク31が提供するI/F公開機能とI/F参照機能で実現され得る。
なお、理論上は、複数のアプリケーションでUIフレーム(UI frame)54を共通化し、コアロジック(Core Logic)52をそれぞれ個別に設けるパターンも存在し得る。但し、この場合にはフレームワーク31から見ると構造が複雑化するため、実施形態では特に言及していない。勿論、このことは当該パターンの排除を必ずしも意味するものではない。
<アプリケーションのライフサイクル管理>
図12は、フレームワーク31による各アプリケーションのライフサイクル管理を行う際の基本構成を示す。ここで、フレームワーク31は、アプリケーションの実行環境である。
プレゼンテーション層に、フレームワーク31及び各種アプリケーション50が存在するとともに、ブータ(Booter)60及びスタータアプリケーション64が存在する。また、デバイスサービス層に、アプリケーション管理コンポーネント62が存在する。
ブータ(Booter)60は、プレゼンテーション層全体の起動終了管理を行うコンポーネントである。フレームワーク31は、ブータ(Booter)60により初期化され起動される。
アプリケーション管理コンポーネント62は、各種アプリケーション50のマニフェストファイル56に基づきアプリケーションのリストをフレームワーク31に提供する。
スタータアプリケーション64は、フレームワーク31が定義するスタータI/F70を実装するアプリケーションである。このスタータアプリケーション64は、システムで唯一つ存在するアプリケーションであり、全アプリケーション50の初期化完了時にフレームワーク31から呼び出される。
各種アプリケーション50は、既述したようにコピーアプリケーションやIDコピーアプリケーション、ファクスアプリケーション等であり、コアロジック(Core Logic)52を備える。各種アプリケーション50のコアロジック(Core Logic)52は、フレームワーク31が定義するアプリケーションI/F72を実装する。
各アプリケーション50が実装するアプリケーションI/Fは、具体的には、
・初期化時処理(initialize)
・終了時処理(finalize)
・ウインドウ押し出し処理(windowPushedOut)
・ウインドウ露出時処理(windowPrepareExposed)
・ウインドウ削除時処理(windowPrepareTerminated)
である。各アプリケーション50は、これらのイベントに対するハンドラを実装する。
フレームワーク31は、各種アプリケーション50のコアロジック(Core Logic)52の間で、メソッドの公開/呼び出し、イベントの公開/購読/発行を可能にするためのJava Scriptコンポーネント(これを通信制御コンポーネントと称する)を備える。メソッドは任意の引数をとり、任意の戻り値を返す定義が可能である。公開したメソッドは、アプリケーション毎に独立して管理される。メソッド呼び出し側のアプリケーションは、メソッドの処理完了をコールバック呼出により確認できる。また、イベントは、各アプリケーションが任意のデータを伴って定義可能である。公開したイベントは、アプリケーション毎に独立して管理される。より詳細には、通信制御コンポーネントはコアロジック(Core Logic)52によるメソッドの公開及び呼び出し、イベントの定義と発行及びリスナの登録を可能とし、「on」によりメソッドを公開し、「off」によりメソッドの公開を停止する。公開されたメソッドはcallにより呼び出し可能である。例えば、第1のアプリケーションがあるI/Fを「on」してフレームワーク31に対して公開し、第2のアプリケーションが第1のアプリケーションの公開されたI/Fを対象としてフレームワーク31に対して「call」する等である。
メソッドの公開/呼び出し、イベントの公開/購読/発行をより具体的な仕様(API)で説明すると以下の通りである。
Java ScriptコンポーネントであるArena comのオブジェクトをarenaComとし、arenaCom.on(methodName,methodFunc)によりメソッドを公開する。引数methodNameは公開するメソッドの名前であり、methodFuncは公開するメソッド処理の実体である。公開さえたメソッドは、callにより呼び出すことができる。
arenaCom.off(methodName)によりメソッドの公開を停止する。methodNameは公開を停止するメソッドの名前である。
arenaCom.call(appid,methodName,args,callbacl)により公開されているメソッドを呼び出す。Appidはメソッド公開元のアプリケーションID、methodNameは呼び出す公開メソッド名、argsは引数、callbackはメソッド処理の完了時に呼び出されるコールバックである。
arenaCom.publishEvent(eventName)によりイベントを公開する。eventNameは公開するイベント名である。イベントは、公開直後からリスナ登録が可能となる。また、arenaCom.unpublishEvent(eventName)によりイベントを非公開にする。eventNameは非公開にするイベント名である。
arenaCom.addListener(appid,eventName,listenerFunction,completeCallback)により公開イベントに対してリスナを登録する。Appidはイベントを公開しているアプリケーションのID、eventNameは受信するイベントの名前、listenerFunctionはイベント発生時に呼び出される処理の実体、completeCallbackはリスナ登録の完了時に呼び出されるコールバックである。
arenaCom.fireEvent(EventName,data,completeCallback)によりイベントを発火する。EventNameは発火させるイベント名、dataはイベントに付随するデータ、completeCallbackは当該イベントに対する全リスナへの発火完了時に呼び出されるコールバックである。
arenaCom.fireEventTo(listenerid,eventName,data,completeCallback)により特定リスナに対してイベントを発火する。listeneridはイベント通知先のアプリケーションID,completeCallbackは当該イベントに対する特定リスナへの発火完了時に呼び出されるコールバックである。
図13は、フレームワーク31による各種アプリケーションのライフサイクル管理のフローチャートを示す。
ブータ(Booter)60がフレームワーク31を起動すると、フレームワーク31は、デバイスサービス層のアプリケーション管理コンポーネント62に対してアプリケーションリストを要求し、アプリケーション管理コンポーネント62からアプリケーションリストを取得する。
フレームワーク31は、アプリケーションリストを取得すると、このリストに従ってアプリケーション毎のベースフレーム(Base frame)を作成し、スタータアプリケーション64を含む各種アプリケーション50のロードを行う(ロードフェーズ)。すなわち、各アプリケーションのコアロジック(Core Logic)52の読み込みを行う。具体的には、フレームワーク31は、マニフェストファイル56に規定されたコアロジック(Core Logic)52の格納先情報を参照してコアロジック(Core Logic)52をロードする。ベースフレーム(Base Frame)は、各アプリケーションのコアロジック(Core Logic)52を実行するためのフレームであり、このフレームが表示されることはない。各アプリケーションのコアロジック(Core Logic)52のロード順序は任意であり順不同である。全てのアプリケーションが、アプリケーションI/F実装を登録完了した時点で次のフェーズに移行する。
なお、アプリケーションI/F実装の登録処理よりも前に、各アプリケーション自身のメソッド及びイベントは公開されているものとする。
次に、フレームワーク31は、アプリケーションI/Fを通じて、各アプリケーションにイニシャライズ(初期化)を指示する(イニシャライズフェーズ)。具体的には、フレームワーク31は、各アプリケーションに対して”app”イベント、”initialize”メソッドを発行する。全アプリケーションが、初期化指示に対する完了時呼び出しコールバックを呼び出した時点で、フレームワーク31はブータ(Booter)60に対して初期化処理の完了を通知し、次のフェーズに移行する。各アプリケーションの初期化順序も任意である。この初期化処理において、各アプリケーションはデバイスサービス層に対するデータ取得を実行する。
次に、ブータ(Booter)60は、フレームワーク31に対してアプリケーションによる機能提供の開始指示を行い、フレームワーク31は、これを受けてスタータアプリケーション64に対して開始指示を行う(開始フェーズ)。スタータアプリケーション64は、デバイスサービス層で管理されている初期起動アプリケーションの情報を取得し、初期画面を表示する。スタータアプリケーション64が、開始指示に対する完了時呼び出しコールバックを呼び出した時点でこのフェーズが完了する。
なお、システム終了時には、フレームワーク31は各アプリケーションのコアロジック(Core Logic)52に対してファイナライズ(終了)を指示する。また、アプリケーション毎のベースフレーム(Base frame)を破棄する。
ロードフェーズでは、順不同で各アプリケーションのコアロジック(Core Logic)52を読み込むので、アプリケーションを追加したとしてもこのロードフェーズを変更する必要がない。また、イニシャライズフェーズでは、全アプリケーションの初期化を行うので他のアプリケーションを呼び出すことが保証されており、個別の待ち合わせは不要である。このように、アプリケーション間の待ち合わせが無くなり、かつ、比較的小さいサイズのコアロジック(Core Logic)52のみをロードするので、システム起動時間及びアプリケーション起動時間が短縮される。
各アプリケーションが独自にI/Fを公開している場合、アプリケーション毎に起動、初期化前処理、初期化、初期化後処理、停止、一時停止等が異なるためアプリケーション毎に初期化レベルに相違が生じ、アプリケーションを呼び出すことができるタイミングもばらついてしまう。特に、アプリケーションを呼び出す前に、相手を呼び出せる状態であるか否かを確認する必要が生じ、制御が複雑化してしまう。これに対し、実施形態では、上記のように初期化時間が短縮されるとともに、初期化後のホーム画面の起動時間も短縮され得る。
図14は、従来及び実施形態におけるシステム起動からホーム画面が表示されるまでの時間を比較して示す。
従来においては、アプリ初期化時間は、純粋な初期化時間に加えて待ち時間を要しており、ホーム画面の起動時間も同様に純粋な起動時間に加えて待ち時間を要していたところ、実施形態では純粋な初期化時間を短縮できるとともに待ち時間を削減することもできる。ホーム起動時間についても同様である。従来においては、アプリケーション間で依存関係がある場合にはデッドロックが生じないような調整が必要であるところ、実施形態ではこのような依存関係がないためデッドロック用調整も不要化される。
以上説明したように、本実施形態では、アプリケーションをコアロジック(Core Logic)52とUIフレーム(UI frame)54に分離し、フレームワーク31が定義するI/Fをコアロジック(Core Logic)52が実装する構成とし、コアロジック(Core Logic)52がフレームワーク31を介して他のアプリケーションのコアロジック(Core Logic)52と通信し、他方でUIフレーム(UI frame)54はそのアプリケ−ションのコアロジック(Core Logic)52のみと通信する構成とすることで、各アプリケーションは、フレームワーク31によって定義された共通の構成を有すると同時に、他のアプリケーションとの間の結合度合いが低くなるように構成することが可能となり、追加や削除が容易化される。
次に、追加可能なアプリケーションを実装する場合について説明する。既述したように、アプリケーションには、標準搭載されるアプリケーションの他に、追加可能なアプリケーションがある。標準搭載されるアプリケーションは、フレームワーク31が定義したI/Fを提供するソフトウェアであり、内部アプリケーションといえる。他方、追加可能なアプリケーションは、既存のアプリケーションであり得、またサードパーティから提供されるアプリケーションであり得るため、必ずしもフレームワーク31が定義したI/Fを提供するとは限らない外部アプリケーションである。このため、後から追加可能なアプリケーション(以下では「外部アプリケーション」と称する)に対して大幅な修正を加えることなく実装することが可能で、しかも、たとえ外部アプリケーションの動作が不安定あるいは異常が生じた場合であっても、他の内部アプリケーションの動作に影響を与えないことが望ましい。
そこで、既述したように、外部アプリケーションには、外部アプリケーションの種類毎に特別なコンパニオンアプリケーションを割り当て、コンパニオンアプリケーションがフレームワーク31と外部アプリケーションとの間に介在して外部アプリケーションを実行する。
図15は、外部アプリケーション及びコンパニオンアプリケーションを備えるシステムの論理構成を示す。図2に対応するものである。プレゼンテーション層30には、内部アプリケーション(内部アプリ)として、ホーム画面を表示するためのホームアプリケーション(ホームアプリ)70、異常時の画面を制御するフォールトアプリケーション(フォールトアプリ)72に加え、コンパニオンアプリケーション(コンパニオンアプリ)74,76,78が実装される。また、外部アプリケーション(外部アプリ)として、外部アプリA80、外部アプリB82,外部アプリC84が実装される。コンパニオンアプリ74は外部アプリA80に対応するコンパニオンアプリであり、コンパニオンアプリ76は外部アプリB82に対応するコンパニオンアプリであり、コンパニオンアプリ78は外部アプリC84に対応するコンパニオンアプリである。各コンパニオンアプリ74,76,78は、フレームワーク31と外部アプリA80、外部アプリB82、外部アプリC84とを仲介するソフトウェアであり、フレームワーク31が外部アプリA80、外部アプリB82、外部アプリC84に要求する条件を吸収する機能を備える。コンパニオンアプリ74,76,78は、ホーム画面上のボタンが利用者により操作されると、ホームアプリ
70からの要求に応じて外部アプリA80,B82,C84を起動する。コンパニオンアプリ74,76,78が内部アプリとしての要求を吸収するので、外部アプリA80,外部アプリB82,外部アプリC84を修正することなく、内部アプリとしての要件を満たし得る。
図16は、他の論理構成を示す。外部アプリ毎にコンパニオンアプリを実装するのではなく、単一のコンパニオンアプリ75で複数の外部アプリを管理する構成である。コンパニオンアプリ75は外部アプリA80,外部アプリB82、及び外部アプリC84に対応するコンパニオンアプリである。コンパニオンアプリ75は、フレームワーク31と外部アプリA80、外部アプリB82、及び外部アプリC84とを仲介するソフトウェアであり、フレームワーク31が外部アプリA80、外部アプリB82、及び外部アプリC84に要求する条件を吸収する機能を備える。
外部アプリを起動する場合、内部アプリと同様の画面遷移及び操作性が維持されることがシステム全体をシームレスに構築する観点からは望ましい。このため、内部アプリは内部ブラウザで起動し、外部アプリは外部ブラウザで起動するように互いに異なるブラウザでそれぞれのアプリを起動するようにしてたとえ外部ブラウザに異常が生じたとしても内部ブラウザに影響を与えないようにし、フレームワーク31が内部ブラウザのみならず外部ブラウザもまとめて管理し、より特定的には、通常のiframeベースのウインドウに加えて外部ブラウザもウインドウの一種として扱い統一的に管理する。このように、内部ブラウザと外部ブラウザをまとめて管理し、ともにウインドウとして制御することで、内部アプリと外部アプリの画面制御情報が一元化されるので、制御が簡易化される。
なお、本実施形態では、フレームワーク31が内部ブラウザのみならず外部ブラウザもまとめて管理し、通常のiframeベースのウインドウに加えて外部ブラウザもウインドウの一種として扱い統一的に管理するが、これとは異なり、コンパニオンアプリが状況に応じて内部ブラウザと外部ブラウザの切替を行うスーパーバイザー的な機能を有するシステムとして構築することも可能である。
図17は、コンパニオンアプリ74の機能ブロック図を示す。コンパニオンアプリ75,76,78についても同様である。
コンパニオンアプリ74は、機能モジュールとして、外部アプリメタ情報管理部741と、動作条件検査部742と、外部アプリ起動指示部743と、外部アプリプロセス管理部744と、イベント検知部745を備える。
外部アプリ起動指示部743は、フレームワーク31を介してホームアプリ70に外部アプリボタン情報を提供するとともに、ユーザが外部アプリボタンを操作するとこれに応じてフレームワーク31を介してホームアプリ70からのlaunch指令を受信する。外部アプリ起動指示部743は、Launch指令を受信すると、フレームワーク31に対してウインドウの生成及びウインドウの表示指令を提供し、外部アプリプロセス管理部744の情報を更新する。
外部アプリメタ情報管理部741は、コンパニオンアプリ74のマニフェスト情報を記憶する。
動作条件検査部742は、起動指令を受けたときにその権限の有無をチェックする。
外部アプリプロセス管理部744は、ウインドウの生成指令で生成された外部アプリプロセスを記憶する。
イベント検知部745は、外部アプリ終了要求コマンドを受け付ける。
なお、コンパニオンアプリ74は、これ以外にも、外部プロセスが異常終了したときにその通知を受け取り、外部アプリプロセス管理部744の管理情報を更新する異常終了検知部や、ログアウト等を検知して起動中の外部アプリを終了させてキャッシュクリアするコンテキスト変更検知部等を備えていてもよい。
図18は、外部アプリメタ情報管理部741に記憶されるマニフェスト情報の一例を示す。図において、”type”はアプリケーションの種別を示し、”EXT”とあるのは外部アプリであることを示す。また、”subid”は種別内でのIDを示す。また、”appUrl”は、外部ブラウザが開くURLを示す。さらに、”toolsicon”と”displayName”は、ホーム画面に表示するアイコンと名前を示す。
図19は、フレームワーク31の機能ブロック図を示す。フレームワーク31は、機能モジュールとして、イベント送受信部311、画面制御部312、アプリ判別部313、ウインドウ管理部314、階層管理部315、及びアプリケーション管理部316を備える。
画面制御部312は、全体のフローを制御する。すなわち、外部からのウインドウの生成要求の受付からその結果を返す全体の制御を行う。また、ウインドウ管理情報を生成し、ウインドウ管理部314に情報を追加する。
アプリ判別部313は、アプリの種別を用いて呼び出す関数を呼び分ける。すなわち、内部用関数か外部用関数かで呼び分ける。具体的には、アプリの種別と関数の対応関係を規定するテーブルを記憶し、このテーブルを用いて呼び分ける。
階層管理部315は、階層構造を管理する。階層管理部315は、各階層のアクティブなウインドウを管理する。階層管理部315は、具体的にはアプリケーション層/ポップアップ層/バナー層/アラート(低レベル)層/アラート(高レベル)層/フォールト層の順に階層構造を管理するとともに、外部アプリについて内部アプリのアプリケーション層の下にウインドウを挿入する。
ウインドウ管理部314は、ウインドウIDをキーにして各ウインドウの情報を管理する。ウインドウ情報には、内部ウインドウ情報及び外部アプリウインドウ情報が含まれる。
図20は、ウインドウ管理部314で管理されるウインドウ管理情報の一例を示す。ウインドウ管理情報は、共通管理情報314aと、内部ウインドウ管理情報314bあるいは外部アプリウインドウ管理情報314cから構成される。内部アプリの場合には共通管理情報314aと内部ウインドウ管理情報314bから構成され、外部アプリの場合には共通管理情報314aと外部アプリウインドウ管理情報314cから構成される。共通管理情報314aには、ウインドウIDや表示状態、階層を規定する階層idが含まれる。内部ウインドウ管理情報314bには、内部ウインドウのhtmlのdiv要素やhtmlのiframe要素が含まれる。外部アプリウインドウ管理情報314cには、外部ウインドウのhtmlのdiv要素やデバイスサービス層(D層)のプロセスIDが含まれる。ここで、外部ウインドウのhtmlのdiv要素は、外部ウインドウを内部ウインドウに埋め込むためのdiv要素である。この外部ウインドウのhtmlのdiv要素は、透明な枠だけの空のdiv要素であり、いわばダミーのdiv要素として機能する。このダミーのdiv要素を内部アプリのiframeを扱うのと同じように画面階層に挿入することでシームレスな画面制御が可能となる。
コンパニオンアプリ74の各機能モジュール、及びフレームワーク31の各機能モジュールの動作について、さらに詳述する。
図21は、ホーム画面上の外部アプリのボタンがユーザにより操作されてから、外部アプリが表示されるまでのシーケンスを示す。ユーザ、ホームアプリ70、コンパニオンアプリ74(あるいはコンパニオンアプリ75,76,78)、フレームワーク31、及びデバイスサービス層(デバイス層)32の処理である。
ユーザが外部アプリボタンを押下操作すると、ホームアプリ70は、ユーザにより押下されたボタンのlaunch指令とその付随情報をコンパニオンアプリ74に送信する。付随情報には、外部アプリのID、すなわちマニフェスト情報のsubidが含まれる。
コンパニオンアプリ74の外部アプリ起動指示部743は、ホームアプリ70からのlaunch指令を受信し、外部アプリIDに基づいて外部アプリメタ情報管理部741から外部アプリメタ情報を取得する。また、外部アプリ起動指示部743は、動作条件検査部742に対して指定された外部アプリの起動条件が満たされているか否かをチェックするように指令する。コンパニオンアプリ74の動作条件検査部742は、現在のユーザをフレームワーク31から取得するとともに、現在のユーザが有する権限をデバイスサービス層32の権限情報管理部から取得し、現在のユーザが指定された外部アプリを起動する権限を有しているか否かを確認する。コンパニオンアプリ74の外部アプリ起動指示部743は、現在のユーザが指定された外部アプリを起動する権限を有している場合、フレームワーク31に対してウインドウの生成指令(createWindow)を発行する。この際、外部アプリの詳細情報、具体的には外部アプリの種別とそのIDを提供する。
フレームワーク31の画面制御部312は、コンパニオンアプリ74からのウインドウの生成指令createWindow)を受け取ると、アプリ判別部313がウインドウ情報生成に用いる関数を決定する。画面制御部312は、アプリ判別部313で決定された外部アプリ用ウインドウ生成関数を実行して、ウインドウ管理情報を生成する。ウインドウ管理情報は、共通管理情報314a及び外部アプリウインドウ管理情報314cから構成される。外部アプリウインドウ管理情報314cには、既述したように内部側の埋め込み用としてのダミーのdiv要素も含まれる。画面制御部312は、生成したウインドウ管理情報をウインドウ管理部314に追加する。画面制御部312は、これらの管理情報に基づいてデバイスサービス層32に対して外部アプリの起動を指令する。具体的には、外部アプリの種別及びIDとともに外部ブラウザの起動要求を指令する。
デバイスサービス層32は、指定された外部アプリを起動し、そのプロセスIDをフレームワーク31に返す。デバイスサービス層32は、生成した外部アプリウインドウを非表示とし、かつ、内部ブラウザウインドウよりも下の階層に配置する。
フレームワーク31は、プロセスIDを受け取ると、外部アプリのウインドウIDをウインドウ生成指令createWindow)の結果としてコンパニオンアプリ74に返す。
コンパニオンアプリ74は、次に、フレームワーク31に対して外部アプリ表示要求(showWindow)を発行する。
フレームワーク31の画面制御部312は、外部アプリ表示要求(showWindow)を受け付けると、指定されたウインドウの表示処理を開始し、同じ階層に表示されている別のウインドウがあればその別ウインドウの非表示処理を開始する(押し出し処理)。指定されたウインドウが外部アプリウインドウであれば、内部側にダミーあるいはエイリアスとして作成したdivを表示し、外部アプリウインドウを表示する。そして、階層管理部315に指定されたウインドウを最下位階層のウインドウとして登録する。また、画面制御部312は、内部ブラウザウインドウを表示するか否かを決定する。すなわち、階層管理部315に問い合わせて、各階層に表示されているウインドウを確認し、最下位階層以外にバナーやフォールト等のウインドウが内部側に表示されている場合には内部ブラウザを表示し、そうでない場合には内部ブラウザを非表示とする(図では、内部側をLUIと略記する)。
図22は、押し出し処理のシーケンスを示す。
画面には、外部アプリウインドウが表示されており、ユーザがこの状態からホームキーを押下した場合を想定する。
デバイスサービス層32は、ユーザによるホームキーの押下を検知すると、フレームワーク31に対してホームキーの押下を提供する。
フレームワーク31のイベント送受信部311は、ホームキーの押下イベントを受け付けると、ホームアプリ70にその旨を通知する。
ホームアプリ70は、ホームキー押下イベントを受信すると、フレームワーク31に対して作成済みのホーム画面のウインドウIDを指定してウインドウ表示(showWindow)を呼ぶ。
フレームワーク31の画面制御部312は、ウインドウ表示(showWindow)を受け付けると、指定されたウインドウの表示処理を開始し、同じ階層に表示されている別のウインドウがあればその別ウインドウの非表示処理を開始する。非表示になったウインドウが外部アプリウインドウであれば、内部側へのダミーあるいはエイリアスとして作成したdivを非表示とし、外部アプリウインドウを非表示とする。そして、コンパニオンアプリ74に押し出しイベントwindowPusheOut)を通知する。この押し出しイベント通知は、言うまでもなく外部アプリウインドウが非表示になったことの通知である。これにより、ホーム画面の表示指令によって外部アプリウインドウは非表示になる。
コンパニオンアプリ74は、押し出しイベント(windowPushedOut)を受信すると、イベント検知部745がこれを検知して必要な処理、具体的には内部のウインドウ状態管理を更新する。
図23は、ユーザがホーム画面上の外部アプリボタンを押下したときに、既に起動済みの外部アプリが存在し、非表示になっていた場合のシーケンス図を示す。
ユーザがホーム画面上の外部アプリボタンを押下すると、ホームアプリ70は、押下されたボタンのLaunch指令とその付随情報、すなわち外部アプリID(マニフェスト情報におけるsubid)をコンパニオンアプリ74に通知する。
コンパニオンアプリ74の外部アプリ起動指示部743は、Launch指令を受け取ると、外部アプリプロセス管理部744に指定された外部アプリが起動済みか否かを問い合わせる。指定された外部アプリが起動済みの場合、外部アプリ起動指示部743は、外部アプリプロセス管理部744から外部アプリIDに対応するウインドウIDを取得し、フレームワーク31に対して外部アプリ表示要求(showWindow)を発行する。
フレームワーク31の画面制御部312は、外部アプリ表示要求showWindow)を受け付けると、指定されたウインドウの表示処理を開始し、同じ階層に表示されている別のウインドウがあればその別ウインドウの非表示処理を開始する(押し出し処理)。指定されたウインドウが外部アプリウインドウであれば、内部側のダミーあるいはエイリアスとして作成したdivを表示し、外部アプリウインドウを表示する。そして、階層管理部315に指定されたウインドウを最下位階層の表示ウインドウとして登録する。また、画面制御部312は、内部ブラウザウインドウを表示するか否かを決定する。すなわち、階層管理部315に問い合わせて、各階層に表示されているウインドウを確認し、最下位階層以外にフォールトやバナー等のウインドウが表示されている場合は内部ブラウザを表示し、そうでない場合は内部ブラウザを非表示とする。
図24は、外部アプリ正常終了時のシーケンス図であり、ユーザが外部アプリ内の終了ボタンを押下した場合のシーケンス図である。
ユーザが外部アプリの終了ボタンを押下すると、当該外部アプリはデバイスサービス層32に対して終了要求を通知する。
デバイスサービス層32は、外部アプリから終了要求を受け付けると、フレームワーク31に対して終了要求を通知する。
フレームワーク31のイベント送受信部311は、プロセスIDを含む終了要求を受け付けると、ウインドウ管理部314にプロセスIDからウインドウIDへの変換を指示する。そして、イベント送受信部311は、コンパニオンアプリ74に対してウインドウ終了準備イベント(windowPrepareTerminated)を発行する。
コンパニオンアプリ74のイベント検知部745は、フレームワーク31からのウインドウ終了準備イベントを受信し、当該外部アプリの終了準備を行う。すなわち、ブラウザのヒストリ及びキャッシュをクリアし、認証アプリへのリスナの削除等である。イベント検知部745は、フレームワーク31に対してウインドウ終了準備完了を通知する。
フレームワーク31のイベント送受信部311は、コンパニオンアプリ74からウインドウ終了準備完了通知を受信すると、デバイスサービス層32に対してプロセス終了要求を発行し、階層管理部315の表示中ウインドウを削除する。また、ウインドウ管理部314からウインドウ情報を削除する。さらに、イベント送受信部311は、コンパニオンアプリ74に対してウインドウ終了イベント(windowTerminated)を発行する。
コンパニオンアプリ74のイベント検知部745は、フレームワーク31からウインドウ終了イベントを受信すると、外部アプリプロセス管理部744に当該プロセスの管理情報の削除を指示し、フレームワーク31に対して初期画面表示要求を発行する。
フレームワーク31のアプリケーション管理部316は、コンパニオンアプリ74からの初期画面表示要求を受信すると、ホームアプリ70(初期起動アプリ)に初期画面表示要求を発行する。これにより、初期画面としてホーム画面が表示される。なお、初期画面としてホーム画面以外を設定してもよい。
図25は、外部アプリ異常終了時のシーケンス図であり、外部アプリのプロセスがメモリ不足やセグメンテーションフォルト等の何らかの原因により異常終了する場合のシーケンス図である。なお、ユーザには動作中の外部アプリが見えている場合もあれば、押し出し処理によりバックグラウンドで存在している場合もある。
オペレーティングシステム(OS)が外部アプリの異常終了を検知すると、デバイスサービス層32はフレームワーク31に対して外部アプリ異常終了を通知する。
フレームワーク31のイベント送受信部311は、プロセスIDが含まれる外部アプリ異常終了通知を受信すると、ウインドウ管理部314にプロセスIDからウインドウIDへの変換を指示し、外部アプリウインドウが表示中だった場合には、階層管理部315の表示中ウインドウを削除する。また、イベント送受信部311は、ウインドウ管理部からウインドウ情報を削除し、コンパニオンアプリ74に対してウインドウ終了イベント(windowTerminated)を発行する。
コンパニオンアプリ74のイベント検知部745は、フレームワーク31からウインドウ終了イベントを受信すると、外部アプリプロセス管理部744に当該プロセスの管理情報の削除を指示するとともに、その他の必要な後処理を行う。さらに、イベント検知部745は、外部アプリが表示中だった場合には、フレームワーク31に対して初期画面表示要求を発行する。
フレームワーク31のアプリケーション管理部316は、初期画面表示要求を受信すると、ホームアプリ70(初期起動アプリ)に初期画面表示要求を発行する。なお、外部アプリの異常終了の場合、初期画面としてのホーム画面ではなく、バナーやフォールトでエラー通知してもよい。
図26は、外部から終了した場合のシーケンス図であり、ユーザが画像処理装置のWeb(ウェブ)UIから外部アプリ利用禁止設定をした場合のシーケンス図である。
ユーザは、WebUI上で外部アプリの利用を禁止する設定を行う。WebUIは、外部アプリ利用禁止設定をデバイスサービス層32に通知する。
コンパニオンアプリ74のイベント検知部745は、デバイスサービス層32から外部アプリ利用設定が禁止になった旨の通知を受信すると、外部アプリプロセス管理部744に起動中の外部アプリが存在するか否かをチェックするように指示する。イベント検知部745は、起動中の外部アプリが存在し、かつ表示中の場合、フレームワーク31に対して初期画面表示要求を発行するとともに、ウインドウ終了イベント(terminateWindow)を発行する。その引数はウインドウIDである。
フレームワーク31の画面制御部312は、ウインドウ終了イベント(terminateWindow)を受け付け、外部アプリが表示中である場合に、階層管理部315の表示中ウインドウを削除し、ウインドウ管理部314からウインドウ情報を削除する。また、デバイスサービス層32に対してプロセス終了要求を発行する。デバイスサービス層32は、このプロセス終了要求に応じて外部アプリを終了する。さらに、アプリケーション管理部316は、コンパニオンアプリ74からの初期画面表示要求を受信し、初期画面起動アプリとしてのホームアプリ70に初期画面表示要求を発行する。これにより、外部アプリが終了して初期画面としてホーム画面が表示される。
ここで、画面を削除する場合等、ある画面から別の画面に遷移させる場合、地の色(背景色)がないと見栄えが良くないため、地の色を例えば黒等にして画面遷移させることが効果的である。
図27(a)は、フレームワーク31の画面制御部312及び階層管理部315で制御される内部ブラウザによるウインドウの階層構造を模式的に示す。既述したように、画面制御部312及び階層管理部315は、アプリ層/ポップアップ層/バナー層/アラート(低レベル)層/アラート(高レベル)層/フォールト層の順に階層構造を管理するが、図では簡略化のため、アプリ層及びフォールト層のみを示す。アプリ層の下に地の色(背景色)の層88を配置し、内部ブラウザのみでウインドウを表示する場合には、この地の色を例えば黒に設定する(図のハッチング領域)。従って、アプリ層のアプリのウインドウが例えばそのウインドウの中心に収縮するように画面遷移すると、ユーザには遷移中の余白領域の色として当該地の色である黒が見える。
図27(b)は、ホーム画面においてユーザが特定のアプリボタンを押下し、特定のアプリを起動した場合の画面例を示す。ホーム画面のウインドウ90が縮小し、これとともに特定のアプリ(図ではコピー)のウインドウ92がホーム画面90の上に表示される。このとき、ホーム画面及びアプリ画面の下に、地の色(黒)94が表示される。
他方、地の色として黒を表示すると、内部ブラウザのアプリ層の下に外部アプリのウインドウを配置した場合、この地の色の黒がユーザの視点の妨げとなり、アプリ層の下の外部アプリを視認することができない事態が生じ得る。勿論、内部ブラウザを非表示とする場合には地の色も当然ながら非表示となるため外部アプリを視認することが可能であるが、アプリ層の上の階層のフォールト層やバナー層においてフォールト表示やバナー表示を行う場合には、内部ブラウザを表示することになるため地の色も表示されることとなり、地の色のために外部アプリが視認不能となってしまう。
図28は、アプリ層の下の階層に外部アプリを配置してこれを表示状態にするとともに、フォールトやバナー表示を行うために内部ブラウザも表示状態とした場合の階層構造を示す。地の色の層88としての黒が存在するため、ユーザからは外部アプリを見ることができない。図において、×印は視認不能であることを示す。
そこで、外部アプリを内部ブラウザの下の階層に配置して表示する場合において、内部ブラウザを表示する必要があるときに、フレームワーク31は、地の色を通常の黒から他の色、例えば半透明や透明に変化させて、外部アプリを視認可能とする。外部アプリを表示する場合において内部ブラウザも表示する必要があるときは、具体的にはフォールト層にフォールト表示を行うとき、あるいはバナー層にバナー表示を行う時などである。
図29(a)は、外部アプリを内部ブラウザの下の階層に配置して表示する場合において、フォールト表示を行う場合の階層構造を模式的に示す。フレームワーク31は内部ブラウザを表示状態にしてフォールト表示を行うとともに、地の色の層88を例えば透明とする。
図29(b)は、このときの画面表示を示す。地の色が透明であるため、フォールト96(例えばドキュメントフィーダのカバーが開いている場合のメッセージ表示)を表示しても地の色の下の階層に配置されている外部アプリを視認することができる。
図30(a)は、外部アプリを内部ブラウザの下の階層に配置して表示する場合において、バナー表示を行う場合の階層構造を模式的に示す。フレームワーク31は内部ブラウザを表示状態にしてバナー表示するとともに、地の色を例えば透明とする。
図30(b)は、このときの画面表示を示す。地の色の層88が透明であるため、バナー98を表示しても地の色の下の階層に配置されている外部アプリを視認することができる。なお、図29に示すフォールト表示の場合、装置自体の異常であるためユーザはアプリを操作することはできないが、図30に示すバナー表示の場合、装置自体の異常ではないためユーザは継続して外部アプリを操作したいと欲する場合もある。この場合、内部ブラウザのアプリ層に埋め込まれたダミーの透明div要素を用いて外部アプリに対するユーザ操作を検知し得る。この点については更に後述する。
図31は、フォールト表示を行う場合のシーケンス図を示す。外部アプリが起動されて外部アプリのウインドウが表示されている状態において、ユーザが例えば装置のインターロックを解除した場合のシーケンス図である。
ユーザがインターロックを解除(オープン)すると、デバイスサービス層32がこれを検知し、フォールトアプリにフォールト発生のイベントを通知する。
フォールトアプリは、フォールト発生のイベントを受け付けると、フレームワーク31に対してフォールト画面の生成(createWindow)を要求する。なお、フォールト画面は、最上位の層として要求する。また、フォールトアプリは、フレームワーク31に対してフォールト画面の表示(showWindow)を要求する。
フレームワーク31の画面制御部312は、フォールトアプリからの要求を受け付けると、内部アプリとしての通常の処理を行いウインドウを表示する。すなわち、iframeを生成し、フォールト画面のhtmlファイルをロードする。そして、フォールトアプリからの画面表示の要求に応じてiframeを表示する。このとき、画面制御部312は、ウインドウ管理部314に問い合わせ、表示すべき内部ウインドウがあるか否か、及び表示すべき外部アプリウインドウがあるか否かをチェックする。そして、チェック結果に応じて以下の表示処理を実行する。
(a)表示すべき内部ウインドウがなく、表示すべき外部ウインドウがある場合:
内部ブラウザを非表示とし、外部アプリウインドウを表示する
(b)表示すべき内部ウインドウがあり、表示すべき外部ウインドウがある場合:
内部ブラウザを表示するとともに、地の色(背景色)を透明に設定し、外部アプリウインドウを表示する
(c)表示すべき内部ウインドウがあり、表示すべき外部アプリウインドウがない場合:
内部ブラウザを表示し、外部アプリウインドウは表示しない
(d)表示すべき内部ウインドウがなく、表示すべき外部アプリウインドウもない場合:
内部ブラウザを表示し、外部アプリウインドウは表示しない
図において、上記の(b)の場合が相当するとして画面制御部312は地の色を透明に設定している。地の色を透明にすることで、内部ブラウザを表示していても、その下の階層の外部アプリウインドウを表示してユーザに視認させ得る。
なお、上記の(c)の場合において、内部ブラウザを表示しても地の色を透明にせず黒のままとしているのは、表示すべき外部アプリウインドウがないため地の色を透明化する必要がないからである。(b)から(c)の状態に遷移した場合も、地の色を透明から元の黒に変更することは言うまでもない。
バナー表示を行う場合のシーケンス図も、図31に示すフォールト表示を行う場合のシーケンス図と同様である。但し、バナー表示を行う場合、ユーザはバナー表示で隠されていない部分の外部アプリを操作したいと欲する場合がある。
図32は、バナー表示を行っている状態でのシーケンス図である。外部アプリが起動されて外部アプリのウインドウが表示され、かつバナー表示されている状態において、ユーザがバナー表示以外の外部アプリ部分を操作する場合のシーケンス図である。
ユーザがバナー表示以外の部分であって外部アプリが見えている部分について操作を行うと、フレームワーク31のイベント送受信部311は外部アプリウインドウ領域に対応する透明div要素を用いてユーザの操作イベントを受け付けると、デバイスサービス層32に対して当該操作イベントの転送を要求する。
デバイスサービス層32は、フレームワーク31からの転送要求に応じて、外部アプリに対して当該操作イベントを転送する。これにより、外部アプリは、ユーザの操作を受け付けて操作に応じた処理を実行する。バナー表示の部分は、透明div要素よりも上の階層に配置されているので、透明div要素を介して外部アプリに操作イベントが転送されることはない。ダミーとしての透明div要素は、内部アプリウインドウと外部アプリウインドウをシームレスに管理・制御する機能を有するとともに、外部アプリにバナーを重畳表示した場合にもバナー表示で隠れていない部分での外部アプリの操作を可能とする機能を有するといえる。
図33は、バナー表示におけるユーザ操作イベントの転送処理を模式的に示す。バナー表示されていても、ユーザには透明div要素及び透明の地の色の層88を通して外部アプリが視認できる。ユーザが画面を操作すると、当該操作は透明div要素に対する操作として検知され、フレームワーク31はデバイスサービス層32を介して外部アプリに当該操作イベントを転送する。ユーザは、透明div要素及び透明の地の色の層88を介して外部アプリを操作しているといえる。
本実施形態における「コンポーネント」とは、論理的に分離可能なソフトウェアの部品を意味する。コンポーネントは1つ又は複数のプロセッサによって実行され得る。本実施形態では、JavaScriptを用いているが、勿論これ以外のプログラミング言語を用いることもできる。
また、本発明は上記の実施形態に限定されるものではなく、種々の変形例が可能である。以下に、変形例について説明する。
<変形例1>
実施形態では、画像処理装置12の制御部(プロセッサ)22が、プレゼンテーション層30のフレームワーク31及び各種アプリケーション50を実行するものとしているが、図2に示すように、プレゼンテーション層30とデバイスサービス層32は分離しているから、プレゼンテーション層30のフレームワーク及び各種アプリケーション50を画像処理装置12と異なる別個の装置、例えば画像処理装置12を制御するためのスマートフォンやタブレット端末等の携帯端末のプロセッサが実行する構成としてもよい。また、図1における操作部26も携帯端末に搭載されることが望ましい。この場合、携帯端末と画像処理装置12とを併せて画像処理装置ないし画像処理システムということができる。
<変形例2>
実施形態では、画面遷移の視覚的効果を考慮して地の色(背景色)を黒等の非透明にし、外部アプリウインドウを表示するとともにフォールト表示やバナー表示の場合に地の色を透明(半透明を含む)に設定しているが、表示すべきフォールトやバナーの種類に応じて地の色を変化させてもよい。例えば、フォールト表示の場合には地の色を半透明とし、バナー表示の場合には地の色を透明とする、あるいはフォールト表示の場合には地の色をグレーとする、あるいは特定のバナー表示の場合には地の色をグレーとし、その他のバナー表示の場合には地の色を透明とする等である。地の色を透明にするのは、フォールト表示やバナー表示にもかかわらず外部アプリウインドウをユーザに視認させることが目的であるから、外部アプリを視認させる必要がある場合のみ地の色を透明に設定し得る。
<変形例3>
実施形態では、フレームワーク31が定義したI/Fを提供するシステムに標準実装されたアプリケーションを内部アプリケーション(内部アプリ)とし、追加可能なアプリケーションであって、既存のアプリケーションあるいはサードパーティから提供されるアプリケーションでありフレームワーク31が定義したI/Fを提供するとは限らないアプリケーションを外部アプリケーション(外部アプリ)と定義しているが、これに限らず、互いに異なる種類の第1アプリと第2アプリを実装するシステムに広く適用し得る。例えば、システムに予め組み込まれた標準的なアプリ等を第1アプリ、これ以外の追加可能なアプリ等を第2アプリとし、第1アプリのウインドウ(第1ウインドウ)を背景色とともに表示する場合であって、第1アプリの第1ウインドウの下の階層に第2アプリのウインドウ(第2ウインドウ)を表示するときに、背景色を透明(半透明を含む)に設定することができる。