1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
package me.texx.Texx
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color.RED
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.os.Environment
import android.support.v7.app.AppCompatActivity
import android.view.Window
import android.view.WindowManager
import com.otaliastudios.cameraview.CameraListener
import com.otaliastudios.cameraview.Gesture
import com.otaliastudios.cameraview.GestureAction
import com.otaliastudios.cameraview.SessionType
import daio.io.dresscode.dressCodeName
import daio.io.dresscode.matchDressCode
import kotlinx.android.synthetic.main.activity_camera.*
import me.texx.Texx.util.ThemeUtil.getThemeName
import org.jetbrains.anko.intentFor
import org.jetbrains.anko.longToast
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.*
/**
* Activity to either record a video or take a photo
* Output will be saved and redirected to corresponding preview activity
*/
class CameraActivity : AppCompatActivity() {
/**
* Set initial configuration
*/
override fun onCreate(savedInstanceState: Bundle?) {
matchDressCode()
super.onCreate(savedInstanceState)
dressCodeName = getThemeName(this)
requestWindowFeature(Window.FEATURE_NO_TITLE)
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN)
setContentView(R.layout.activity_camera)
initCameraLayout()
}
private fun initCameraLayout() {
setGestures()
setListeners()
}
private fun setGestures() {
camera.mapGesture(Gesture.PINCH, GestureAction.ZOOM)
camera.mapGesture(Gesture.TAP, GestureAction.FOCUS_WITH_MARKER)
camera.mapGesture(Gesture.LONG_TAP, GestureAction.CAPTURE)
camera.mapGesture(Gesture.SCROLL_HORIZONTAL, GestureAction.EXPOSURE_CORRECTION)
}
private fun setListeners() {
camera.addCameraListener(object : CameraListener() {
override fun onPictureTaken(jpeg: ByteArray?) {
val file: File? = createFile()
writeFile(BitmapFactory.decodeByteArray(jpeg, 0, jpeg!!.size), file)
startActivity(intentFor<PhotoEditorActivity>("filepath" to file.toString()))
}
})
camera_button.setOnClickListener {
camera.capturePicture()
}
camera_button.setOnLongClickListener {
if (camera.sessionType == SessionType.PICTURE) {
camera.sessionType = SessionType.VIDEO
val videoButtonDrawable: Drawable = this.resources.getDrawable(R.drawable.focus_marker_outline)
videoButtonDrawable.colorFilter = PorterDuffColorFilter(RED, PorterDuff.Mode.SRC_IN)
camera_button.setBackgroundDrawable(videoButtonDrawable)
} else {
camera.sessionType = SessionType.PICTURE
camera_button.setBackgroundDrawable(this.resources.getDrawable(R.drawable.focus_marker_outline))
}
true
}
}
/**
* Saves [bitmap] in local storage and returns the absolute path [String] of the file
*/
private fun writeFile(bitmap: Bitmap, file: File?) {
if (file == null) {
longToast("Error creating file - please check the storage permission.)")
return
}
try {
val out = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)
out.close()
} catch (e: FileNotFoundException) {
longToast("File not found - please try again.\n(${e.message})")
} catch (e: IOException) {
longToast("Error accessing file - please try again.\n(${e.message})")
}
}
/**
* Creates empty file to write the file on
*/
private fun createFile(): File? {
val mediaStorageDir = File(Environment.getExternalStorageDirectory().toString()
+ "/Android/media/"
+ applicationContext.packageName
+ "/Images")
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null
}
}
val mediaFile: File
mediaFile = File(mediaStorageDir.path + File.separator + generateFilename())
return mediaFile
}
private fun generateFilename(): String {
val timestamp = SimpleDateFormat("ddMMyyyy_HHmm").format(Date())
return "Texx_$timestamp.jpg"
}
/**
* Start components on activity resume (called at start)
*/
override fun onResume() {
super.onResume()
camera.start()
}
/**
* Stop components on activity pause
*/
override fun onPause() {
super.onPause()
camera.stop()
}
/**
* Destroy components on activity close
*/
override fun onDestroy() {
super.onDestroy()
camera.destroy() // doesn't really destroys your camera lol
}
}
|