Issue 488
[zxing.git] / symbian / ZXingBarcodeReader / src / ZXingBarcodeReaderAppUi.cpp
1 /*\r
2  * Copyright (c) 2009 Nokia Corporation.\r
3  */\r
4 \r
5 // INCLUDE FILES\r
6 #include <avkon.hrh>\r
7 #include <eikon.hrh>\r
8 #include <aknmessagequerydialog.h>\r
9 #include <aknnotewrappers.h>\r
10 #include <eikenv.h>\r
11 \r
12 #include <ZXingBarcodeReader_0xEF24C10A.rsg>\r
13 #include "ZXingBarcodeReader.hrh"\r
14 #include "ZXingBarcodeReader.pan"\r
15 #include "ZXingBarcodeReaderApplication.h"\r
16 #include "ZXingBarcodeReaderAppUi.h"\r
17 #include "ZXingBarcodeReaderAppView.h"\r
18 \r
19 \r
20 // ============================ MEMBER FUNCTIONS ===============================\r
21 \r
22 void CZXingBarcodeReaderAppUi::ConstructL ()\r
23     {\r
24     // Initialise app UI with standard value.\r
25     BaseConstructL (CAknAppUi::EAknEnableSkin );\r
26 \r
27     // Start receiving camera shutter key events\r
28     #ifdef ENABLE_CAMERA_SHUTTER\r
29     CaptureCameraShutter(ETrue);\r
30     #endif\r
31     \r
32     // Make this class observe changes in foreground events\r
33     iEikonEnv->AddForegroundObserverL(*this);\r
34     \r
35     // Create view\r
36     iAppView = CZXingBarcodeReaderAppView::NewL (ClientRect () );\r
37     }\r
38 \r
39 CZXingBarcodeReaderAppUi::CZXingBarcodeReaderAppUi ()\r
40     {\r
41     }\r
42 \r
43 CZXingBarcodeReaderAppUi::~CZXingBarcodeReaderAppUi ()\r
44     {\r
45     delete iAppView;\r
46     \r
47     #ifdef ENABLE_CAMERA_SHUTTER\r
48     CaptureCameraShutter(EFalse);\r
49     #endif\r
50 \r
51     iShutterKeyHandles.Close();\r
52     }\r
53 \r
54 #ifdef ENABLE_CAMERA_SHUTTER\r
55 \r
56 void CZXingBarcodeReaderAppUi::CaptureCameraShutter(TBool aEnable)\r
57     {\r
58     // Try to capture events from the camera shutter key(s)\r
59     // http://wiki.forum.nokia.com/index.php/KIS000563_-_Camera_shutter_key_(EKeyCamera_events)_cannot_be_used_in_3rd_party_applications\r
60     if (aEnable && !iCameraKeyCaptured)\r
61         {\r
62         iCameraKeyCaptured = ETrue;\r
63         // Enable capturing\r
64         RProcess proc;\r
65         iShutterKeyHandles.Reset();\r
66         if(proc.HasCapability(ECapabilitySwEvent))\r
67             {\r
68             for(TInt i=0; KCameraShutterKeyEventCodes[i] != 0; i++)\r
69                 {\r
70                 TInt32 handle = iEikonEnv->RootWin().CaptureKey( KCameraShutterKeyEventCodes[i], 0, 0 );\r
71                 if(handle >= 0)\r
72                     {\r
73                     iShutterKeyHandles.Append(handle);\r
74                     }\r
75                 }\r
76             }\r
77         }\r
78     else if(!aEnable && iCameraKeyCaptured)\r
79         {\r
80         iCameraKeyCaptured = EFalse;\r
81         // Disable capturing\r
82         // Release the captured camera shutter key(s)\r
83         for(TInt i=0; i < iShutterKeyHandles.Count(); i++)\r
84             {\r
85             iEikonEnv->RootWin().CancelCaptureKey( iShutterKeyHandles[i] );\r
86             }\r
87         }\r
88     }\r
89 #endif\r
90 \r
91 \r
92 void CZXingBarcodeReaderAppUi::HandleGainingForeground()\r
93     {\r
94     // Application gets focused so reserve the camera\r
95     // http://wiki.forum.nokia.com/index.php/CS000821_-_Handling_Camera_resource\r
96     if ( iAppView && \r
97          iAppView->CameraEngine() &&\r
98          iAppView->CameraEngine()->State() != CCameraEngine::EEngineNotReady )\r
99         {\r
100         iAppView->CameraEngine()->ReserveAndPowerOn();\r
101         \r
102 #ifdef ENABLE_CAMERA_SHUTTER\r
103         CaptureCameraShutter(ETrue);\r
104 #endif\r
105         }\r
106     }\r
107 \r
108 void CZXingBarcodeReaderAppUi::HandleLosingForeground()\r
109     {\r
110     // Application loses focus so release the camera\r
111     // http://wiki.forum.nokia.com/index.php/CS000821_-_Handling_Camera_resource\r
112     if ( iAppView && \r
113          iAppView->CameraEngine() &&\r
114          iAppView->CameraEngine()->State() != CCameraEngine::EEngineNotReady )\r
115         {\r
116         iAppView->CameraEngine()->ReleaseAndPowerOff();\r
117         \r
118 #ifdef ENABLE_CAMERA_SHUTTER\r
119         CaptureCameraShutter(EFalse);\r
120 #endif\r
121         }\r
122     }\r
123 \r
124 void CZXingBarcodeReaderAppUi::UseOptionsExitCbaL()\r
125     {\r
126     CEikButtonGroupContainer* cba = Cba();\r
127     if (cba)\r
128         {\r
129         cba->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_EXIT);\r
130         cba->DrawNow();\r
131         }\r
132     }\r
133 \r
134 void CZXingBarcodeReaderAppUi::UseOptionsBackCbaL()\r
135     {\r
136     CEikButtonGroupContainer* cba = Cba();\r
137     if (cba)\r
138         {\r
139         cba->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);\r
140         cba->DrawNow();\r
141         }\r
142     }\r
143 \r
144 TBool CZXingBarcodeReaderAppUi::IsBackCBA()\r
145     {\r
146     CEikButtonGroupContainer* cba = Cba();\r
147     // NOTE: There should be EAknSoftkeyBack in the application because\r
148     // we use R_AVKON_SOFTKEYS_SELECT_BACK, but it seems that there is EAknSoftkeyCancel\r
149     CCoeControl* back = cba->ControlOrNull(EAknSoftkeyBack);\r
150     CCoeControl* cancel = cba->ControlOrNull(EAknSoftkeyCancel);\r
151     if (back || cancel)\r
152         return ETrue;\r
153     else\r
154         return EFalse;\r
155     }\r
156 \r
157 TKeyResponse CZXingBarcodeReaderAppUi::HandleKeyEventL(\r
158     const TKeyEvent& aKeyEvent,TEventCode aType)\r
159     {\r
160     // Capture picture with selection key\r
161     switch ( aKeyEvent.iCode )\r
162         {\r
163         case EKeyOK:\r
164         case EStdKeyDevice3:\r
165         case EKeyUpArrow:\r
166         case EKeyDownArrow:  \r
167             {\r
168             // Capture picture\r
169             return iAppView->OfferKeyEventL(aKeyEvent,aType);\r
170             }\r
171         default:\r
172             {\r
173             break;\r
174             }\r
175         };\r
176 \r
177     // Camera shutter events handling\r
178     #ifdef ENABLE_CAMERA_SHUTTER\r
179     // Camera shutter autofocus\r
180     switch ( aKeyEvent.iScanCode )\r
181         {\r
182         case KStdKeyCameraFocus:\r
183         case KStdKeyCameraFocus2:\r
184             {\r
185             // Camera shutter autofocus\r
186             return iAppView->OfferKeyEventL(aKeyEvent,aType);\r
187             }\r
188         default:\r
189             {\r
190             break;\r
191             }\r
192         };\r
193     // Camera shutter key\r
194     for(TInt i=0; KCameraShutterKeyEventCodes[i] != 0; i++)\r
195           {\r
196           if( KCameraShutterKeyEventCodes[i] == aKeyEvent.iCode )\r
197             {\r
198             // Capture image\r
199             iAppView->Capture();\r
200             return EKeyWasConsumed;\r
201             }\r
202           }\r
203     #endif\r
204 \r
205     return EKeyWasNotConsumed;\r
206     }\r
207 \r
208 void CZXingBarcodeReaderAppUi::HandleCommandL (TInt aCommand )\r
209     {\r
210     switch (aCommand )\r
211         {\r
212         case EEikCmdExit:\r
213         case EAknSoftkeyExit:\r
214             {\r
215             Exit();\r
216             break;\r
217             }\r
218         case EAknSoftkeyBack:\r
219             {\r
220             iAppView->CancelCapturedPicture();\r
221             UseOptionsExitCbaL();\r
222             break;\r
223             }\r
224         case EAbout:\r
225             {\r
226             CAknMessageQueryDialog* dlg = new (ELeave) CAknMessageQueryDialog ();\r
227             dlg->PrepareLC (R_ABOUT_QUERY_DIALOG );\r
228             HBufC* title = iEikonEnv->AllocReadResourceLC (R_ABOUT_DIALOG_TITLE );\r
229             dlg->QueryHeading ()->SetTextL (*title );\r
230             CleanupStack::PopAndDestroy (); //title\r
231             HBufC* msg = iEikonEnv->AllocReadResourceLC (R_ABOUT_DIALOG_TEXT );\r
232             dlg->SetMessageTextL (*msg );\r
233             CleanupStack::PopAndDestroy (); //msg\r
234             dlg->RunLD();\r
235             break;\r
236             }\r
237         default:\r
238             {\r
239             break;\r
240             }\r
241         };\r
242     }\r
243 \r
244 void CZXingBarcodeReaderAppUi::HandleResourceChangeL(TInt aType)\r
245     {\r
246     CAknAppUi::HandleResourceChangeL( aType );\r
247        \r
248     if ( aType==KEikDynamicLayoutVariantSwitch )\r
249         {\r
250         if (iAppView)\r
251             {\r
252             TRect rect;\r
253             AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,rect);\r
254             iAppView->SetRect(rect);\r
255             }\r
256         }   \r
257     \r
258     }\r
259 \r
260 // End of File\r