Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,6 @@ Requirements

- Due to the version of OpenCV that is used, this project requires Android 5.0 (lollipop) or newer to run.

- In order to capture and manipulate images, Open Note Scanner depends on having the OpenCV Manager application installed.
- If not installed, Open Note Scanner will ask to download it from https://github.com/ctodobom/OpenCV-3.1.0-Android or from the Google Play Store.


How to Install
--------------

Expand Down
70 changes: 44 additions & 26 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,32 @@ plugins {
}

android {
compileSdk = 33
buildToolsVersion = "33.0.0"
compileSdk = 36
namespace = "com.todobom.opennotescanner"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11

buildFeatures {
buildConfig = true
}
splits {
abi {
isEnable = true
reset()
include("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
isUniversalApk = true
}
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
isCoreLibraryDesugaringEnabled = true
}
defaultConfig {
applicationId = "com.todobom.opennotescanner"
minSdk = 21
targetSdk = 31
versionCode = 36
versionName = "1.0.36"
targetSdk = 36
versionCode = 37
versionNameSuffix = "alpha"
versionName = "1.0.37"
}
buildTypes {
getByName("release") {
Expand All @@ -45,28 +55,36 @@ android {
}
}

kotlin {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
}
}

dependencies {
implementation(fileTree(mapOf("include" to listOf("*.jar"), "dir" to "libs")))
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")

implementation("androidx.core:core-ktx:1.9.0")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10")
implementation("androidx.core:core-ktx:1.16.0")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.20")

implementation("androidx.exifinterface:exifinterface:1.3.6")
implementation("com.guolindev.permissionx:permissionx:1.8.1")
implementation("androidx.exifinterface:exifinterface:1.4.1")
testImplementation("junit:junit:4.13.2")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.fragment:fragment-ktx:1.5.5")
implementation("com.google.android.material:material:1.8.0")
implementation("com.google.zxing:core:3.5.1")
implementation("com.github.ctodobom:OpenCV-3.1.0-Android:9e00ee4218ca0c9e60a905c9f09bf499f9dc5115")
implementation("us.feras.mdv:markdownview:1.1.0")
implementation("androidx.appcompat:appcompat:1.7.1")
implementation("androidx.fragment:fragment-ktx:1.8.8")
implementation("com.google.android.material:material:1.12.0")
implementation("com.google.zxing:core:3.5.3")
implementation("org.opencv:opencv:4.12.0")
implementation("io.noties.markwon:core:4.6.2")
implementation("io.noties.markwon:html:4.6.2")
implementation("com.github.ctodobom:drag-select-recyclerview:0.3.4.ctodobom.sections")
implementation("com.github.allgood:Android-Universal-Image-Loader:717a00c")
implementation("com.github.ctodobom:FabToolbar:3c5f0e0ff1b6d5089e20b7da7157a604075ae943")
implementation("com.github.matomo-org:matomo-sdk-android:4.1.4")
implementation("com.github.MikeOrtiz:TouchImageView:3.3")
implementation("com.github.matomo-org:matomo-sdk-android:4.3.4")
implementation("com.github.MikeOrtiz:TouchImageView:3.7.1")

val itextpdf_version = "7.2.5"
implementation("com.itextpdf:kernel:$itextpdf_version")
implementation("com.itextpdf:layout:$itextpdf_version")
implementation("com.itextpdf:io:$itextpdf_version")
val itextpdfVersion = "9.2.0"
implementation("com.itextpdf:kernel:$itextpdfVersion")
implementation("com.itextpdf:layout:$itextpdfVersion")
implementation("com.itextpdf:io:$itextpdfVersion")
}
8 changes: 5 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@

<uses-feature
android:name="android.hardware.camera"
android:required="false" />
android:required="true" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.todobom.opennotescanner

import android.app.Activity
import android.content.Context
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand All @@ -17,13 +18,13 @@ import java.util.*
*/
class FullScreenImageAdapter(
private val _activity: Activity,
private val _imagePaths: ArrayList<String>
private val _imageUris: ArrayList<Uri>
) : PagerAdapter() {
private var maxTexture = 0
private var mImageLoader: ImageLoader? = null
private var mTargetSize: ImageSize? = null
override fun getCount(): Int {
return _imagePaths.size
return _imageUris.size
}

override fun isViewFromObject(view: View, `object`: Any): Boolean {
Expand All @@ -37,7 +38,7 @@ class FullScreenImageAdapter(
val viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,
false)
imgDisplay = viewLayout.findViewById<View>(R.id.imgDisplay) as TouchImageView
val imagePath = _imagePaths[position]
val imageUri = _imageUris[position]
/*
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Expand All @@ -62,13 +63,13 @@ class FullScreenImageAdapter(
*/

// imgDisplay.setImageBitmap(bitmap);
mImageLoader!!.displayImage("file:///$imagePath", imgDisplay, mTargetSize)
mImageLoader!!.displayImage(imageUri.toString(), imgDisplay, mTargetSize)
container.addView(viewLayout)
return viewLayout
}

fun getPath(position: Int): String {
return _imagePaths[position]
fun getUri(position: Int): Uri {
return _imageUris[position]
}

override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.todobom.opennotescanner

import android.app.AlertDialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.webkit.MimeTypeMap
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import androidx.core.net.toFile
import androidx.viewpager.widget.ViewPager
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
import com.nostra13.universalimageloader.core.ImageLoader
Expand All @@ -20,7 +24,6 @@ import com.todobom.opennotescanner.helpers.Utils
import com.todobom.opennotescanner.helpers.Utils.Companion.maxTextureSize
import com.todobom.opennotescanner.helpers.Utils.Companion.removeImageFromGallery
import com.todobom.opennotescanner.views.TagEditorFragment
import java.io.File

class FullScreenViewActivity : AppCompatActivity() {
private lateinit var utils: Utils
Expand Down Expand Up @@ -83,7 +86,7 @@ class FullScreenViewActivity : AppCompatActivity() {

private fun loadAdapter(): FullScreenImageAdapter {
mViewPager.adapter = null
val adapter = FullScreenImageAdapter(this@FullScreenViewActivity, utils.filePaths)
val adapter = FullScreenImageAdapter(this@FullScreenViewActivity, utils.fileUris)
adapter.setImageLoader(mImageLoader)
adapter.setMaxTexture(mMaxTexture, mTargetSize)
mViewPager.adapter = adapter
Expand Down Expand Up @@ -127,10 +130,20 @@ class FullScreenViewActivity : AppCompatActivity() {
return super.onOptionsItemSelected(item)
}

private fun isPng(context: Context, uri: Uri): Boolean {
// First try MIME type
val type = context.contentResolver.getType(uri)
if (type == "image/png") return true

// Fallback: try extension
val extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString())
return extension.equals("png", ignoreCase = true)
}

private fun tagImage() {
val item = mViewPager.currentItem
val filePath = mAdapter.getPath(item)
if (filePath.endsWith(".png")) {
val fileUri = mAdapter.getUri(item)
if (isPng(this, fileUri)) {
val builder = AlertDialog.Builder(this)
builder.setTitle(R.string.format_not_supported)
builder.setMessage(R.string.format_not_supported_message)
Expand All @@ -139,32 +152,30 @@ class FullScreenViewActivity : AppCompatActivity() {
alerta.show()
return
}
val fm = supportFragmentManager
val tagEditorDialog = TagEditorFragment()
tagEditorDialog.setFilePath(filePath)
tagEditorDialog.setRunOnDetach { }
tagEditorDialog.show(fm, "tageditor_view")
val tagEditorDialog = TagEditorFragment(fileUri)
tagEditorDialog.show(supportFragmentManager, "tageditor_view")
}

private fun deleteImage() {
val item = mViewPager.currentItem
val filePath = mAdapter.getPath(item)
val photoFile = File(filePath)
photoFile.delete()
removeImageFromGallery(filePath, this)
val fileUri = mAdapter.getUri(item)
removeImageFromGallery(fileUri, this)
loadAdapter()
if (0 == mAdapter.count) finish()
mViewPager.currentItem = item
}

fun shareImage() {
val pager = mViewPager
val item = pager.currentItem
val uri = mAdapter.getUri(mViewPager.currentItem)
val shareIntent = Intent(Intent.ACTION_SEND)
shareIntent.type = "image/jpg"
val uri = FileProvider.getUriForFile(applicationContext, "$packageName.fileprovider", File(mAdapter.getPath(item)))
shareIntent.putExtra(Intent.EXTRA_STREAM, uri)
Log.d("Fullscreen", "uri $uri")
val shareUri = if (uri.scheme == "file") {
FileProvider.getUriForFile(applicationContext, "$packageName.fileprovider", uri.toFile())
} else {
uri
}
shareIntent.type = this.contentResolver.getType(shareUri)
shareIntent.putExtra(Intent.EXTRA_STREAM, shareUri)
Log.d("Fullscreen", "uri $shareUri")
startActivity(Intent.createChooser(shareIntent, getString(R.string.share_snackbar)))
}
}
Loading