Skip to content

Commit 92e119d

Browse files
authored
Merge pull request #11 from rosuH/dev
Release 1.0.1
2 parents 0090116 + c43dab8 commit 92e119d

36 files changed

Lines changed: 697 additions & 254 deletions

app/build.gradle

Lines changed: 0 additions & 64 deletions
This file was deleted.

app/build.gradle.kts

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import ProductFlavors.coolApk
2+
import ProductFlavors.github
3+
import ProductFlavors.googlePlay
4+
import ProductFlavors.others
5+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
6+
7+
plugins {
8+
id("com.android.application")
9+
id("kotlin-android")
10+
id("kotlin-android-extensions")
11+
}
12+
13+
android {
14+
compileSdkVersion(Apps.compileSdk)
15+
buildToolsVersion(Apps.buildTools)
16+
17+
defaultConfig {
18+
applicationId = "me.rosuh.easywatermark"
19+
minSdkVersion(Apps.minSdk)
20+
targetSdkVersion(Apps.targetSdk)
21+
versionCode = Apps.versionCode
22+
versionName = Apps.versionName
23+
24+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
25+
}
26+
27+
buildTypes {
28+
29+
getByName(BuildTypes.Debug) {
30+
isMinifyEnabled = false
31+
applicationIdSuffix = ".${BuildTypes.Debug}"
32+
versionNameSuffix = ".${BuildTypes.Debug}"
33+
isDebuggable = true
34+
}
35+
36+
getByName(BuildTypes.Release) {
37+
isMinifyEnabled = true
38+
isShrinkResources = true
39+
proguardFiles(
40+
getDefaultProguardFile("proguard-android-optimize.txt"),
41+
"proguard-rules.pro"
42+
)
43+
}
44+
}
45+
46+
flavorDimensions("version")
47+
48+
productFlavors {
49+
create(googlePlay) {
50+
versionNameSuffix = "-${googlePlay}"
51+
}
52+
create(github) {
53+
versionNameSuffix = "-${github}"
54+
}
55+
create(coolApk) {
56+
versionNameSuffix = "-${coolApk}"
57+
}
58+
create(others) {
59+
isDefault = true
60+
versionNameSuffix = "-${others}"
61+
}
62+
}
63+
64+
compileOptions {
65+
sourceCompatibility = JavaVersion.VERSION_1_8
66+
targetCompatibility = JavaVersion.VERSION_1_8
67+
}
68+
}
69+
70+
tasks.withType<KotlinCompile> {
71+
kotlinOptions {
72+
jvmTarget = "1.8"
73+
}
74+
}
75+
76+
dependencies {
77+
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
78+
implementation(Libs.kotlin)
79+
implementation(Libs.appcompat)
80+
implementation(Libs.compressor)
81+
implementation(Libs.materialAboutLibrary)
82+
implementation(Libs.material)
83+
implementation(Libs.fragmentKtx)
84+
implementation(Libs.lifecycleLiveData)
85+
implementation(Libs.lifecycleViewModel)
86+
implementation(Libs.colorPickerView)
87+
implementation(Libs.viewpager2)
88+
implementation(Libs.recycleView)
89+
implementation(Libs.constraintLayout)
90+
implementation(Libs.coreKtx)
91+
implementation(Libs.gifDrawable)
92+
testImplementation(TestLibs.junit)
93+
}

app/proguard-rules.pro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Add project specific ProGuard rules here.
22
# You can control the set of applied configuration files using the
3-
# proguardFiles setting in build.gradle.
3+
# proguardFiles setting in build.gradle.kts.kts.
44
#
55
# For more details, see
66
# http://developer.android.com/guide/developing/tools/proguard.html

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
<provider
4747
android:name="androidx.core.content.FileProvider"
48-
android:authorities="me.rosuh.easywatermark.fileprovider"
48+
android:authorities="${applicationId}.fileprovider"
4949
android:exported="false"
5050
android:grantUriPermissions="true">
5151
<meta-data
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package me.rosuh.easywatermark.ktx
2+
3+
import java.security.MessageDigest
4+
5+
fun String.toMD5(): String {
6+
val bytes = MessageDigest.getInstance("MD5").digest(this.toByteArray())
7+
return bytes.toHex()
8+
}
9+
10+
fun ByteArray.toHex(): String {
11+
return joinToString("") { "%02x".format(it) }
12+
}

app/src/main/java/me/rosuh/easywatermark/model/WaterMarkConfig.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,7 @@ class WaterMarkConfig {
130130
const val SP_KEY_DEGREE = SP_NAME + "_key_degree"
131131
const val SP_KEY_ICON_URI = SP_NAME + "_key_icon_uri"
132132
const val SP_KEY_MODE = SP_NAME + "_key_type"
133+
const val SP_KEY_CHANGE_LOG = SP_NAME + "_key_change_log"
134+
133135
}
134136
}

app/src/main/java/me/rosuh/easywatermark/ui/MainActivity.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,14 @@ import me.rosuh.easywatermark.MyApp
3030
import me.rosuh.easywatermark.R
3131
import me.rosuh.easywatermark.model.WaterMarkConfig
3232
import me.rosuh.easywatermark.ui.about.AboutActivity
33+
import me.rosuh.easywatermark.ui.dialog.ChangeLogDialogFragment
3334
import me.rosuh.easywatermark.ui.dialog.CompressImageDialogFragment
3435
import me.rosuh.easywatermark.ui.dialog.SaveImageBSDialogFragment
3536
import me.rosuh.easywatermark.ui.panel.ContentFragment
3637
import me.rosuh.easywatermark.ui.panel.LayoutFragment
3738
import me.rosuh.easywatermark.ui.panel.StyleFragment
39+
import pl.droidsonroids.gif.GifDrawable
40+
import pl.droidsonroids.gif.GifImageView
3841
import kotlin.math.abs
3942

4043

@@ -44,16 +47,21 @@ class MainActivity : AppCompatActivity() {
4447

4548
private val scope = MainScope()
4649

50+
@ObsoleteCoroutinesApi
4751
override fun onCreate(savedInstanceState: Bundle?) {
4852
super.onCreate(savedInstanceState)
4953
setContentView(R.layout.activity_main)
5054
setSupportActionBar(findViewById(R.id.my_toolbar))
5155
scope.launch {
5256
initView()
5357
initObserver()
58+
(iv_logo.drawable as? GifDrawable)?.start()
5459
cl_root.setTransition(R.id.transition_launch)
5560
cl_root.transitionToEnd()
5661
checkHadCrash()
62+
// Activity was recycled but dialog still showing in some case?
63+
SaveImageBSDialogFragment.safetyHide(this@MainActivity.supportFragmentManager)
64+
ChangeLogDialogFragment.safetyShow(this@MainActivity.supportFragmentManager)
5765
}
5866
}
5967

@@ -98,6 +106,7 @@ class MainActivity : AppCompatActivity() {
98106
try {
99107
cl_root.setTransition(R.id.transition_open_image)
100108
cl_root.transitionToEnd()
109+
(iv_logo.drawable as? GifDrawable)?.stop()
101110
iv_photo?.config = it
102111
} catch (se: SecurityException) {
103112
se.printStackTrace()
@@ -228,6 +237,7 @@ class MainActivity : AppCompatActivity() {
228237

229238
val pagerAdapter = ControlPanelPagerAdapter(this, fragmentArray)
230239
vp_control_panel.apply {
240+
isUserInputEnabled = false
231241
offscreenPageLimit = 2
232242
adapter = pagerAdapter
233243
}

app/src/main/java/me/rosuh/easywatermark/ui/MainViewModel.kt

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import android.graphics.Paint
1010
import android.graphics.Rect
1111
import android.net.Uri
1212
import android.os.Build
13+
import android.os.Environment
1314
import android.provider.MediaStore
14-
import android.util.Log
1515
import android.widget.Toast
1616
import androidx.core.app.ActivityCompat
1717
import androidx.core.content.ContextCompat
@@ -22,6 +22,7 @@ import kotlinx.coroutines.Dispatchers
2222
import kotlinx.coroutines.Job
2323
import kotlinx.coroutines.launch
2424
import kotlinx.coroutines.withContext
25+
import me.rosuh.easywatermark.BuildConfig
2526
import me.rosuh.easywatermark.R
2627
import me.rosuh.easywatermark.ktx.applyConfig
2728
import me.rosuh.easywatermark.ktx.formatDate
@@ -99,7 +100,7 @@ class MainViewModel : ViewModel() {
99100
_saveState.postValue(State.Saving)
100101
try {
101102
val outputUri =
102-
generateImage(activity.contentResolver, config.value?.uri ?: Uri.parse(""))
103+
generateImage(activity, config.value?.uri ?: Uri.parse(""))
103104
if (outputUri?.toString().isNullOrEmpty()) {
104105
throw FileNotFoundException()
105106
}
@@ -141,7 +142,7 @@ class MainViewModel : ViewModel() {
141142
try {
142143
_saveState.postValue(State.Sharing)
143144
val outputUri =
144-
generateImage(activity.contentResolver, config.value?.uri ?: Uri.parse(""))
145+
generateImage(activity, config.value?.uri ?: Uri.parse(""))
145146
if (outputUri?.toString().isNullOrEmpty()) {
146147
_saveState.postValue(State.Error.apply {
147148
msg = activity.getString(R.string.error_file_not_found)
@@ -171,8 +172,9 @@ class MainViewModel : ViewModel() {
171172
}
172173

173174
@Throws(FileNotFoundException::class, OutOfMemoryError::class)
174-
private suspend fun generateImage(resolver: ContentResolver, uri: Uri): Uri? =
175+
private suspend fun generateImage(activity: Activity, uri: Uri): Uri? =
175176
withContext(Dispatchers.IO) {
177+
val resolver = activity.contentResolver
176178
val mutableBitmap =
177179
decodeBitmapFromUri(resolver, uri)?.copy(Bitmap.Config.ARGB_8888, true)
178180
?: return@withContext null
@@ -247,13 +249,33 @@ class MainViewModel : ViewModel() {
247249
imageContentUri
248250
} else {
249251
// need request write_storage permission
250-
val u = MediaStore.Images.Media.insertImage(
251-
resolver,
252-
mutableBitmap,
253-
"Easy_water_mark_${System.currentTimeMillis()}.jpg",
254-
""
252+
// should check Pictures folder exist
253+
val picturesFile: File = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
254+
?: return@withContext null
255+
if (!picturesFile.exists()) {
256+
picturesFile.mkdir()
257+
}
258+
val mediaDir = File(picturesFile, "EasyWaterMark")
259+
260+
if (!mediaDir.exists()) {
261+
mediaDir.mkdirs()
262+
}
263+
val outputFile = File(mediaDir, "ewm_${System.currentTimeMillis()}.jpg")
264+
outputFile.outputStream().use { fileOutputStream ->
265+
mutableBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream)
266+
}
267+
val outputUri = FileProvider.getUriForFile(
268+
activity,
269+
"${BuildConfig.APPLICATION_ID}.fileprovider",
270+
outputFile
255271
)
256-
Uri.parse(u)
272+
activity.sendBroadcast(
273+
Intent(
274+
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
275+
Uri.fromFile(outputFile)
276+
)
277+
)
278+
outputUri
257279
}
258280
}
259281

@@ -352,23 +374,15 @@ class MainViewModel : ViewModel() {
352374
input?.copyTo(output)
353375
}
354376
}
355-
Log.i(
356-
"compressImg",
357-
"Before compress: file ${tmpFile.absolutePath}, length = ${tmpFile.length()}"
358-
)
359377
val compressedFile = Compressor.compress(activity, tmpFile)
360378
// clear tmp files
361379
if (tmpFile.exists()) {
362380
tmpFile.delete()
363381
}
364-
Log.i(
365-
"compressImg",
366-
"After compress: compressedFile ${compressedFile.absolutePath}, length = ${compressedFile.length()}"
367-
)
368382
try {
369383
val compressedFileUri = FileProvider.getUriForFile(
370384
activity,
371-
"me.rosuh.easywatermark.fileprovider",
385+
"${BuildConfig.APPLICATION_ID}.fileprovider",
372386
compressedFile
373387
)
374388
updateUri(compressedFileUri)
@@ -392,7 +406,12 @@ class MainViewModel : ViewModel() {
392406
393407
$crashInfo
394408
=====================
395-
${System.getProperty("os.version")}, ${Build.VERSION.SDK_INT}, ${Build.DEVICE}, ${Build.MODEL}, ${Build.PRODUCT}
409+
APP:
410+
${BuildConfig.VERSION_CODE}, ${BuildConfig.VERSION_NAME}, ${BuildConfig.FLAVOR}
411+
Devices:
412+
${Build.VERSION.RELEASE}, ${Build.VERSION.SDK_INT}, ${Build.DEVICE}, ${Build.MODEL}, ${Build.PRODUCT}, ${Build.MANUFACTURER}
413+
=====================
414+
${activity.getString(R.string.contributor_info)}
396415
=====================
397416
${System.currentTimeMillis().formatDate("yyy-MM-dd")}
398417
""".trimIndent()

app/src/main/java/me/rosuh/easywatermark/ui/about/OpenSourceActivity.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,13 @@ class OpenSourceActivity : AppCompatActivity() {
2828
card_material_components.setOnClickListener {
2929
openLink("https://github.com/material-components/material-components-android")
3030
}
31+
32+
card_material_compressor.setOnClickListener {
33+
openLink("https://github.com/zetbaitsu/Compressor/")
34+
}
35+
36+
card_gif.setOnClickListener {
37+
openLink("https://github.com/koral--/android-gif-drawable")
38+
}
3139
}
3240
}

0 commit comments

Comments
 (0)