diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f99a8bad..0d6d569e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,7 +8,7 @@
@@ -30,29 +29,30 @@
-
+
+
-
+
+
-
+
+
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/java/com/burhanrashid52/photoediting/EditImageActivity.kt b/app/src/main/java/com/burhanrashid52/photoediting/EditImageActivity.kt
deleted file mode 100644
index bae63f99..00000000
--- a/app/src/main/java/com/burhanrashid52/photoediting/EditImageActivity.kt
+++ /dev/null
@@ -1,514 +0,0 @@
-package com.burhanrashid52.photoediting
-
-import android.Manifest
-import android.annotation.SuppressLint
-import android.content.DialogInterface
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.graphics.Bitmap
-import android.graphics.Typeface
-import android.net.Uri
-import android.os.Bundle
-import android.provider.MediaStore
-import android.util.Log
-import android.view.MotionEvent
-import android.view.View
-import android.view.animation.AnticipateOvershootInterpolator
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.annotation.RequiresPermission
-import androidx.annotation.VisibleForTesting
-import androidx.appcompat.app.AlertDialog
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.constraintlayout.widget.ConstraintSet
-import androidx.core.content.ContextCompat
-import androidx.core.content.FileProvider
-import androidx.lifecycle.lifecycleScope
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import androidx.transition.ChangeBounds
-import androidx.transition.TransitionManager
-import com.burhanrashid52.photoediting.EmojiBSFragment.EmojiListener
-import com.burhanrashid52.photoediting.StickerBSFragment.StickerListener
-import com.burhanrashid52.photoediting.base.BaseActivity
-import com.burhanrashid52.photoediting.filters.FilterListener
-import com.burhanrashid52.photoediting.filters.FilterViewAdapter
-import com.burhanrashid52.photoediting.tools.EditingToolsAdapter
-import com.burhanrashid52.photoediting.tools.EditingToolsAdapter.OnItemSelected
-import com.burhanrashid52.photoediting.tools.ToolType
-import com.google.android.material.bottomsheet.BottomSheetDialogFragment
-import ja.burhanrashid52.photoeditor.OnPhotoEditorListener
-import ja.burhanrashid52.photoeditor.PhotoEditor
-import ja.burhanrashid52.photoeditor.PhotoEditorView
-import ja.burhanrashid52.photoeditor.PhotoFilter
-import ja.burhanrashid52.photoeditor.SaveFileResult
-import ja.burhanrashid52.photoeditor.SaveSettings
-import ja.burhanrashid52.photoeditor.TextStyleBuilder
-import ja.burhanrashid52.photoeditor.ViewType
-import ja.burhanrashid52.photoeditor.shape.ShapeBuilder
-import ja.burhanrashid52.photoeditor.shape.ShapeType
-import kotlinx.coroutines.launch
-import java.io.File
-import java.io.IOException
-
-class EditImageActivity : BaseActivity(), OnPhotoEditorListener, View.OnClickListener,
- PropertiesBSFragment.Properties, ShapeBSFragment.Properties, EmojiListener, StickerListener,
- OnItemSelected, FilterListener {
-
- lateinit var mPhotoEditor: PhotoEditor
- private lateinit var mPhotoEditorView: PhotoEditorView
- private lateinit var mPropertiesBSFragment: PropertiesBSFragment
- private lateinit var mShapeBSFragment: ShapeBSFragment
- private lateinit var mShapeBuilder: ShapeBuilder
- private lateinit var mEmojiBSFragment: EmojiBSFragment
- private lateinit var mStickerBSFragment: StickerBSFragment
- private lateinit var mTxtCurrentTool: TextView
- private lateinit var mWonderFont: Typeface
- private lateinit var mRvTools: RecyclerView
- private lateinit var mRvFilters: RecyclerView
- private lateinit var mImgUndo: View
- private lateinit var mImgRedo: View
- private val mEditingToolsAdapter = EditingToolsAdapter(this)
- private val mFilterViewAdapter = FilterViewAdapter(this)
- private lateinit var mRootView: ConstraintLayout
- private val mConstraintSet = ConstraintSet()
- private var mIsFilterVisible = false
-
- @VisibleForTesting
- var mSaveImageUri: Uri? = null
-
- private lateinit var mSaveFileHelper: FileSaveHelper
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- makeFullScreen()
- setContentView(R.layout.activity_edit_image)
-
- initViews()
-
- handleIntentImage(mPhotoEditorView.source)
-
- mWonderFont = Typeface.createFromAsset(assets, "beyond_wonderland.ttf")
-
- mPropertiesBSFragment = PropertiesBSFragment()
- mEmojiBSFragment = EmojiBSFragment()
- mStickerBSFragment = StickerBSFragment()
- mShapeBSFragment = ShapeBSFragment()
- mStickerBSFragment.setStickerListener(this)
- mEmojiBSFragment.setEmojiListener(this)
- mPropertiesBSFragment.setPropertiesChangeListener(this)
- mShapeBSFragment.setPropertiesChangeListener(this)
-
- val llmTools = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
- mRvTools.layoutManager = llmTools
- mRvTools.adapter = mEditingToolsAdapter
-
- val llmFilters = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
- mRvFilters.layoutManager = llmFilters
- mRvFilters.adapter = mFilterViewAdapter
-
- // NOTE(lucianocheng): Used to set integration testing parameters to PhotoEditor
- val pinchTextScalable = intent.getBooleanExtra(PINCH_TEXT_SCALABLE_INTENT_KEY, true)
-
- // val mTextRobotoTf = ResourcesCompat.getFont(this, R.font.roboto_medium)
- // val mEmojiTypeFace = Typeface.createFromAsset(getAssets(), "emojione-android.ttf")
-
- mPhotoEditor = PhotoEditor.Builder(this, mPhotoEditorView)
- .setPinchTextScalable(pinchTextScalable) // set flag to make text scalable when pinch
- //.setDefaultTextTypeface(mTextRobotoTf)
- //.setDefaultEmojiTypeface(mEmojiTypeFace)
- .build() // build photo editor sdk
-
- mPhotoEditor.setOnPhotoEditorListener(this)
-
- //Set Image Dynamically
- mPhotoEditorView.source.setImageResource(R.drawable.paris_tower)
-
- mSaveFileHelper = FileSaveHelper(this)
- }
-
- private fun handleIntentImage(source: ImageView) {
- if (intent == null) {
- return
- }
-
- when (intent.action) {
- Intent.ACTION_EDIT, ACTION_NEXTGEN_EDIT -> {
- try {
- val uri = intent.data
- val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
- source.setImageBitmap(bitmap)
- } catch (e: IOException) {
- e.printStackTrace()
- }
- }
-
- else -> {
- val intentType = intent.type
- if (intentType != null && intentType.startsWith("image/")) {
- val imageUri = intent.data
- if (imageUri != null) {
- source.setImageURI(imageUri)
- }
- }
- }
- }
- }
-
- private fun initViews() {
- mPhotoEditorView = findViewById(R.id.photoEditorView)
- mTxtCurrentTool = findViewById(R.id.txtCurrentTool)
- mRvTools = findViewById(R.id.rvConstraintTools)
- mRvFilters = findViewById(R.id.rvFilterView)
- mRootView = findViewById(R.id.rootView)
-
- mImgUndo = findViewById(R.id.imgUndo)
- mImgUndo.setOnClickListener(this)
- mImgUndo.isEnabled = false
-
- mImgRedo = findViewById(R.id.imgRedo)
- mImgRedo.setOnClickListener(this)
- mImgRedo.isEnabled = false
-
- val imgCamera: ImageView = findViewById(R.id.imgCamera)
- imgCamera.setOnClickListener(this)
-
- val imgGallery: ImageView = findViewById(R.id.imgGallery)
- imgGallery.setOnClickListener(this)
-
- val imgSave: ImageView = findViewById(R.id.imgSave)
- imgSave.setOnClickListener(this)
-
- val imgClose: ImageView = findViewById(R.id.imgClose)
- imgClose.setOnClickListener(this)
-
- val imgShare: ImageView = findViewById(R.id.imgShare)
- imgShare.setOnClickListener(this)
- }
-
- override fun onEditTextChangeListener(rootView: View, text: String, colorCode: Int) {
- val textEditorDialogFragment =
- TextEditorDialogFragment.show(this, text.toString(), colorCode)
- textEditorDialogFragment.setOnTextEditorListener(object :
- TextEditorDialogFragment.TextEditorListener {
- override fun onDone(inputText: String, colorCode: Int) {
- val styleBuilder = TextStyleBuilder()
- styleBuilder.withTextColor(colorCode)
- mPhotoEditor.editText(rootView, inputText, styleBuilder)
- mTxtCurrentTool.setText(R.string.label_text)
- }
- })
- }
-
- override fun onAddViewListener(viewType: ViewType, numberOfAddedViews: Int) {
- Log.d(
- TAG,
- "onAddViewListener() called with: viewType = [$viewType], numberOfAddedViews = [$numberOfAddedViews]"
- )
-
- mImgUndo.isEnabled = mPhotoEditor.isUndoAvailable
- mImgRedo.isEnabled = mPhotoEditor.isRedoAvailable
- }
-
- override fun onRemoveViewListener(viewType: ViewType, numberOfAddedViews: Int) {
- Log.d(
- TAG,
- "onRemoveViewListener() called with: viewType = [$viewType], numberOfAddedViews = [$numberOfAddedViews]"
- )
-
- mImgUndo.isEnabled = mPhotoEditor.isUndoAvailable
- mImgRedo.isEnabled = mPhotoEditor.isRedoAvailable
- }
-
- override fun onStartViewChangeListener(viewType: ViewType) {
- Log.d(TAG, "onStartViewChangeListener() called with: viewType = [$viewType]")
- }
-
- override fun onStopViewChangeListener(viewType: ViewType) {
- Log.d(TAG, "onStopViewChangeListener() called with: viewType = [$viewType]")
- }
-
- override fun onTouchSourceImage(event: MotionEvent) {
- Log.d(TAG, "onTouchView() called with: event = [$event]")
- }
-
- @SuppressLint("NonConstantResourceId", "MissingPermission")
- override fun onClick(view: View) {
- when (view.id) {
- R.id.imgUndo -> {
- mImgUndo.isEnabled = mPhotoEditor.undo()
- mImgRedo.isEnabled = mPhotoEditor.isRedoAvailable
- }
-
- R.id.imgRedo -> {
- mImgUndo.isEnabled = mPhotoEditor.isUndoAvailable
- mImgRedo.isEnabled = mPhotoEditor.redo()
- }
-
- R.id.imgSave -> saveImage()
- R.id.imgClose -> onBackPressed()
- R.id.imgShare -> shareImage()
- R.id.imgCamera -> {
- val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
- startActivityForResult(cameraIntent, CAMERA_REQUEST)
- }
-
- R.id.imgGallery -> {
- val intent = Intent()
- intent.type = "image/*"
- intent.action = Intent.ACTION_GET_CONTENT
- startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_REQUEST)
- }
- }
- }
-
- private fun shareImage() {
- val saveImageUri = mSaveImageUri
- if (saveImageUri == null) {
- showSnackbar(getString(R.string.msg_save_image_to_share))
- return
- }
-
- val intent = Intent(Intent.ACTION_SEND)
- intent.type = "image/*"
- intent.putExtra(Intent.EXTRA_STREAM, buildFileProviderUri(saveImageUri))
- startActivity(Intent.createChooser(intent, getString(R.string.msg_share_image)))
- }
-
- private fun buildFileProviderUri(uri: Uri): Uri {
- if (FileSaveHelper.isSdkHigherThan28()) {
- return uri
- }
- val path: String = uri.path ?: throw IllegalArgumentException("URI Path Expected")
-
- return FileProvider.getUriForFile(
- this,
- FILE_PROVIDER_AUTHORITY,
- File(path)
- )
- }
-
- @RequiresPermission(allOf = [Manifest.permission.WRITE_EXTERNAL_STORAGE])
- private fun saveImage() {
- val fileName = System.currentTimeMillis().toString() + ".png"
- val hasStoragePermission = ContextCompat.checkSelfPermission(
- this,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
- ) == PackageManager.PERMISSION_GRANTED
- if (hasStoragePermission || FileSaveHelper.isSdkHigherThan28()) {
- showLoading("Saving...")
- mSaveFileHelper.createFile(fileName, object : FileSaveHelper.OnFileCreateResult {
-
- @RequiresPermission(allOf = [Manifest.permission.WRITE_EXTERNAL_STORAGE])
- override fun onFileCreateResult(
- created: Boolean,
- filePath: String?,
- error: String?,
- uri: Uri?
- ) {
- lifecycleScope.launch {
- if (created && filePath != null) {
- val saveSettings = SaveSettings.Builder()
- .setClearViewsEnabled(true)
- .setTransparencyEnabled(true)
- .build()
-
- val result = mPhotoEditor.saveAsFile(filePath, saveSettings)
-
- if (result is SaveFileResult.Success) {
- mSaveFileHelper.notifyThatFileIsNowPubliclyAvailable(contentResolver)
- hideLoading()
- showSnackbar("Image Saved Successfully")
- mSaveImageUri = uri
- mPhotoEditorView.source.setImageURI(mSaveImageUri)
- } else {
- hideLoading()
- showSnackbar("Failed to save Image")
- }
- } else {
- hideLoading()
- error?.let { showSnackbar(error) }
- }
- }
- }
- })
- } else {
- requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
- }
- }
-
- // TODO(lucianocheng): Replace onActivityResult with Result API from Google
- // See https://developer.android.com/training/basics/intents/result
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- super.onActivityResult(requestCode, resultCode, data)
- if (resultCode == RESULT_OK) {
- when (requestCode) {
- CAMERA_REQUEST -> {
- mPhotoEditor.clearAllViews()
- val photo = data?.extras?.get("data") as Bitmap?
- mPhotoEditorView.source.setImageBitmap(photo)
- }
-
- PICK_REQUEST -> try {
- mPhotoEditor.clearAllViews()
- val uri = data?.data
- val bitmap = MediaStore.Images.Media.getBitmap(
- contentResolver, uri
- )
- mPhotoEditorView.source.setImageBitmap(bitmap)
- } catch (e: IOException) {
- e.printStackTrace()
- }
- }
- }
- }
-
- override fun onColorChanged(colorCode: Int) {
- mPhotoEditor.setShape(mShapeBuilder.withShapeColor(colorCode))
- mTxtCurrentTool.setText(R.string.label_brush)
- }
-
- override fun onOpacityChanged(opacity: Int) {
- mPhotoEditor.setShape(mShapeBuilder.withShapeOpacity(opacity))
- mTxtCurrentTool.setText(R.string.label_brush)
- }
-
- override fun onShapeSizeChanged(shapeSize: Int) {
- mPhotoEditor.setShape(mShapeBuilder.withShapeSize(shapeSize.toFloat()))
- mTxtCurrentTool.setText(R.string.label_brush)
- }
-
- override fun onShapePicked(shapeType: ShapeType) {
- mPhotoEditor.setShape(mShapeBuilder.withShapeType(shapeType))
- }
-
- override fun onEmojiClick(emojiUnicode: String) {
- mPhotoEditor.addEmoji(emojiUnicode)
- mTxtCurrentTool.setText(R.string.label_emoji)
- }
-
- override fun onStickerClick(bitmap: Bitmap) {
- mPhotoEditor.addImage(bitmap)
- mTxtCurrentTool.setText(R.string.label_sticker)
- }
-
- @SuppressLint("MissingPermission")
- override fun isPermissionGranted(isGranted: Boolean, permission: String?) {
- if (isGranted) {
- saveImage()
- }
- }
-
- @SuppressLint("MissingPermission")
- private fun showSaveDialog() {
- val builder = AlertDialog.Builder(this)
- builder.setMessage(getString(R.string.msg_save_image))
- builder.setPositiveButton("Save") { _: DialogInterface?, _: Int -> saveImage() }
- builder.setNegativeButton("Cancel") { dialog: DialogInterface, _: Int -> dialog.dismiss() }
- builder.setNeutralButton("Discard") { _: DialogInterface?, _: Int -> finish() }
- builder.create().show()
- }
-
- override fun onFilterSelected(photoFilter: PhotoFilter) {
- mPhotoEditor.setFilterEffect(photoFilter)
- }
-
- override fun onToolSelected(toolType: ToolType) {
- when (toolType) {
- ToolType.SHAPE -> {
- mPhotoEditor.setBrushDrawingMode(true)
- mShapeBuilder = ShapeBuilder()
- mPhotoEditor.setShape(mShapeBuilder)
- mTxtCurrentTool.setText(R.string.label_shape)
- showBottomSheetDialogFragment(mShapeBSFragment)
- }
-
- ToolType.TEXT -> {
- val textEditorDialogFragment = TextEditorDialogFragment.show(this)
- textEditorDialogFragment.setOnTextEditorListener(object :
- TextEditorDialogFragment.TextEditorListener {
- override fun onDone(inputText: String, colorCode: Int) {
- val styleBuilder = TextStyleBuilder()
- styleBuilder.withTextColor(colorCode)
- mPhotoEditor.addText(inputText, styleBuilder)
- mTxtCurrentTool.setText(R.string.label_text)
- }
- })
- }
-
- ToolType.ERASER -> {
- mPhotoEditor.brushEraser()
- mTxtCurrentTool.setText(R.string.label_eraser_mode)
- }
-
- ToolType.FILTER -> {
- mTxtCurrentTool.setText(R.string.label_filter)
- showFilter(true)
- }
-
- ToolType.EMOJI -> showBottomSheetDialogFragment(mEmojiBSFragment)
- ToolType.STICKER -> showBottomSheetDialogFragment(mStickerBSFragment)
- }
- }
-
- private fun showBottomSheetDialogFragment(fragment: BottomSheetDialogFragment?) {
- if (fragment == null || fragment.isAdded) {
- return
- }
- fragment.show(supportFragmentManager, fragment.tag)
- }
-
- private fun showFilter(isVisible: Boolean) {
- mIsFilterVisible = isVisible
- mConstraintSet.clone(mRootView)
-
- val rvFilterId: Int = mRvFilters.id
-
- if (isVisible) {
- mConstraintSet.clear(rvFilterId, ConstraintSet.START)
- mConstraintSet.connect(
- rvFilterId, ConstraintSet.START,
- ConstraintSet.PARENT_ID, ConstraintSet.START
- )
- mConstraintSet.connect(
- rvFilterId, ConstraintSet.END,
- ConstraintSet.PARENT_ID, ConstraintSet.END
- )
- } else {
- mConstraintSet.connect(
- rvFilterId, ConstraintSet.START,
- ConstraintSet.PARENT_ID, ConstraintSet.END
- )
- mConstraintSet.clear(rvFilterId, ConstraintSet.END)
- }
-
- val changeBounds = ChangeBounds()
- changeBounds.duration = 350
- changeBounds.interpolator = AnticipateOvershootInterpolator(1.0f)
- TransitionManager.beginDelayedTransition(mRootView, changeBounds)
-
- mConstraintSet.applyTo(mRootView)
- }
-
- override fun onBackPressed() {
- if (mIsFilterVisible) {
- showFilter(false)
- mTxtCurrentTool.setText(R.string.app_name)
- } else if (!mPhotoEditor.isCacheEmpty) {
- showSaveDialog()
- } else {
- super.onBackPressed()
- }
- }
-
- companion object {
-
- private const val TAG = "EditImageActivity"
-
- const val FILE_PROVIDER_AUTHORITY = "com.burhanrashid52.photoediting.fileprovider"
- private const val CAMERA_REQUEST = 52
- private const val PICK_REQUEST = 53
- const val ACTION_NEXTGEN_EDIT = "action_nextgen_edit"
- const val PINCH_TEXT_SCALABLE_INTENT_KEY = "PINCH_TEXT_SCALABLE"
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/burhanrashid52/photoediting/EmojiBSFragment.kt b/app/src/main/java/com/burhanrashid52/photoediting/EmojiBSFragment.kt
deleted file mode 100644
index 0acafbf1..00000000
--- a/app/src/main/java/com/burhanrashid52/photoediting/EmojiBSFragment.kt
+++ /dev/null
@@ -1,117 +0,0 @@
-package com.burhanrashid52.photoediting
-
-import android.annotation.SuppressLint
-import android.app.Dialog
-import android.content.Context
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.coordinatorlayout.widget.CoordinatorLayout
-import com.google.android.material.bottomsheet.BottomSheetDialogFragment
-import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback
-import com.google.android.material.bottomsheet.BottomSheetBehavior
-import androidx.recyclerview.widget.RecyclerView
-import androidx.recyclerview.widget.GridLayoutManager
-import com.burhanrashid52.photoediting.PhotoApp.Companion.photoApp
-import java.lang.NumberFormatException
-import java.util.ArrayList
-
-class EmojiBSFragment : BottomSheetDialogFragment() {
- private var mEmojiListener: EmojiListener? = null
-
- interface EmojiListener {
- fun onEmojiClick(emojiUnicode: String)
- }
-
- private val mBottomSheetBehaviorCallback: BottomSheetCallback = object : BottomSheetCallback() {
- override fun onStateChanged(bottomSheet: View, newState: Int) {
- if (newState == BottomSheetBehavior.STATE_HIDDEN) {
- dismiss()
- }
- }
-
- override fun onSlide(bottomSheet: View, slideOffset: Float) {}
- }
-
- @SuppressLint("RestrictedApi")
- override fun setupDialog(dialog: Dialog, style: Int) {
- super.setupDialog(dialog, style)
- val contentView = View.inflate(context, R.layout.fragment_bottom_sticker_emoji_dialog, null)
- dialog.setContentView(contentView)
- val params = (contentView.parent as View).layoutParams as CoordinatorLayout.LayoutParams
- val behavior = params.behavior
- if (behavior != null && behavior is BottomSheetBehavior<*>) {
- behavior.setBottomSheetCallback(mBottomSheetBehaviorCallback)
- }
- (contentView.parent as View).setBackgroundColor(resources.getColor(android.R.color.transparent))
- val rvEmoji: RecyclerView = contentView.findViewById(R.id.rvEmoji)
- val gridLayoutManager = GridLayoutManager(activity, 5)
- rvEmoji.layoutManager = gridLayoutManager
- val emojiAdapter = EmojiAdapter()
- rvEmoji.adapter = emojiAdapter
- rvEmoji.setHasFixedSize(true)
- rvEmoji.setItemViewCacheSize(emojisList.size)
- }
-
- fun setEmojiListener(emojiListener: EmojiListener?) {
- mEmojiListener = emojiListener
- }
-
- inner class EmojiAdapter : RecyclerView.Adapter() {
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
- val view =
- LayoutInflater.from(parent.context).inflate(R.layout.row_emoji, parent, false)
- return ViewHolder(view)
- }
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- holder.txtEmoji.text = emojisList[position]
- }
-
- override fun getItemCount(): Int {
- return emojisList.size
- }
-
- inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
- val txtEmoji: TextView = itemView.findViewById(R.id.txtEmoji)
-
- init {
- itemView.setOnClickListener {
- if (mEmojiListener != null) {
- mEmojiListener!!.onEmojiClick(emojisList[layoutPosition])
- }
- dismiss()
- }
- }
- }
- }
-
- companion object {
- private var emojisList = getEmojis(photoApp)
-
- /**
- * Provide the list of emoji in form of unicode string
- *
- * @param context context
- * @return list of emoji unicode
- */
- fun getEmojis(context: Context?): ArrayList {
- val convertedEmojiList = ArrayList()
- val emojiList = context!!.resources.getStringArray(R.array.photo_editor_emoji)
- for (emojiUnicode in emojiList) {
- convertedEmojiList.add(convertEmoji(emojiUnicode))
- }
- return convertedEmojiList
- }
-
- private fun convertEmoji(emoji: String): String {
- return try {
- val convertEmojiToInt = emoji.substring(2).toInt(16)
- String(Character.toChars(convertEmojiToInt))
- } catch (e: NumberFormatException) {
- ""
- }
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/burhanrashid52/photoediting/MainActivity.kt b/app/src/main/java/com/burhanrashid52/photoediting/MainActivity.kt
new file mode 100644
index 00000000..2f513340
--- /dev/null
+++ b/app/src/main/java/com/burhanrashid52/photoediting/MainActivity.kt
@@ -0,0 +1,37 @@
+package com.burhanrashid52.photoediting
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Button
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import ja.burhanrashid52.photoediting.EditImageActivity
+import ja.burhanrashid52.photoediting.constant.ResponseCode
+
+class MainActivity : AppCompatActivity() {
+ private val EDIT_SUCCESSFUL = 1
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ enableEdgeToEdge()
+ setContentView(R.layout.activity_main)
+// ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
+// val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+// v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
+// insets
+// }
+
+ findViewById