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