]> Pileus Git - ~andy/freeotp/blob - src/org/fedorahosted/freeotp/CameraDialogFragment.java
Migrate Manual token entry to use a DialogFragment
[~andy/freeotp] / src / org / fedorahosted / freeotp / CameraDialogFragment.java
1 /*
2  * FreeOTP
3  *
4  * Authors: Nathaniel McCallum <npmccallum@redhat.com>
5  *
6  * Copyright (C) 2013  Nathaniel McCallum, Red Hat
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20
21 package org.fedorahosted.freeotp;
22
23 import android.app.AlertDialog;
24 import android.content.Context;
25 import android.content.DialogInterface;
26 import android.hardware.Camera;
27 import android.hardware.Camera.Parameters;
28 import android.view.Surface;
29 import android.view.SurfaceHolder;
30 import android.view.SurfaceView;
31 import android.view.View;
32 import android.view.WindowManager;
33 import android.widget.TextView;
34
35 public class CameraDialogFragment extends BaseAlertDialogFragment implements SurfaceHolder.Callback {
36         public static final String FRAGMENT_TAG = "fragment_camera";
37
38         private DecodeAsyncTask mDecodeAsyncTask;
39         private Camera mCamera;
40
41         public CameraDialogFragment() {
42                 super(R.string.scan_qr_code, R.layout.camera,
43                         android.R.string.cancel, R.string.manual_entry, 0);
44         }
45
46         @Override
47         protected void onViewInflated(View view) {
48                 SurfaceView sv = (SurfaceView) view.findViewById(R.id.camera_surfaceview);
49                 sv.getHolder().addCallback(this);
50         }
51
52         @Override
53         public void onClick(DialogInterface dialog, int which) {
54                 if (which == AlertDialog.BUTTON_NEUTRAL) {
55                         new ManualDialogFragment().show(getFragmentManager(),
56                                         ManualDialogFragment.FRAGMENT_TAG);
57                 }
58         }
59
60         @Override
61         public void onDestroyView() {
62                 if (mDecodeAsyncTask != null)
63                         mDecodeAsyncTask.cancel(true);
64
65                 super.onDestroyView();
66         }
67
68         @Override
69         public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
70                 if (mCamera == null)
71                         return;
72
73                 WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);
74                 switch (wm.getDefaultDisplay().getRotation()) {
75                 case Surface.ROTATION_0:
76                         mCamera.setDisplayOrientation(90);
77                         break;
78                 case Surface.ROTATION_270:
79                         mCamera.setDisplayOrientation(180);
80                         break;
81                 }
82
83                 mCamera.startPreview();
84         }
85
86         @Override
87         public void surfaceCreated(SurfaceHolder holder) {
88                 try {
89                         mCamera = Camera.open();
90                         mCamera.setPreviewDisplay(holder);
91
92                         // Create the decoder thread
93                         mDecodeAsyncTask = new DecodeAsyncTask() {
94                                 @Override
95                                 protected void onPostExecute(String result) {
96                                         super.onPostExecute(result);
97                                         if (result != null)
98                                                 ((MainActivity) getActivity()).tokenURIReceived(result);
99                                         mDecodeAsyncTask = null;
100                                         dismiss();
101                                 }
102                         };
103                         mDecodeAsyncTask.execute();
104                         mCamera.setPreviewCallback(mDecodeAsyncTask);
105
106                         // Set auto-focus mode
107                         Parameters params = mCamera.getParameters();
108                         params.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
109                         mCamera.setParameters(params);
110                 } catch (Exception e) {
111                         SurfaceView sv = (SurfaceView) getDialog().findViewById(R.id.camera_surfaceview);
112                         sv.setVisibility(View.INVISIBLE);
113                         TextView tv = (TextView) getDialog().findViewById(R.id.camera_textview);
114                         tv.setVisibility(View.VISIBLE);
115                         e.printStackTrace();
116                 }
117         }
118
119         @Override
120         public void surfaceDestroyed(SurfaceHolder holder) {
121                 if (mCamera == null)
122                         return;
123
124                 mCamera.stopPreview();
125                 mCamera.setPreviewCallback(null);
126                 mCamera.release();
127                 mCamera = null;
128         }
129 }