@@ -20,13 +20,15 @@ import android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback
2020import android.support.v4.content.FileProvider
2121import android.support.v7.app.AlertDialog
2222import android.support.v7.app.AppCompatActivity
23+ import android.util.DisplayMetrics
2324import android.view.*
2425import android.widget.PopupMenu
2526import android.widget.Toast
2627import org.wordpress.android.util.AppLog
2728import org.wordpress.android.util.PermissionUtils
2829import org.wordpress.android.util.ToastUtils
2930import org.wordpress.aztec.AztecText
31+ import org.wordpress.aztec.HistoryListener
3032import org.wordpress.aztec.picassoloader.PicassoImageLoader
3133import org.wordpress.aztec.source.SourceViewEditText
3234import org.wordpress.aztec.toolbar.AztecToolbar
@@ -35,9 +37,14 @@ import org.xml.sax.Attributes
3537import org.xml.sax.helpers.AttributesImpl
3638import java.io.File
3739
38- class MainActivity : AppCompatActivity (), OnRequestPermissionsResultCallback, View.OnTouchListener,
39- PopupMenu .OnMenuItemClickListener , AztecToolbarClickListener , AztecText .OnMediaTappedListener ,
40- AztecText .OnImeBackListener {
40+ class MainActivity : AppCompatActivity (),
41+ AztecText .OnImeBackListener ,
42+ AztecText .OnMediaTappedListener ,
43+ AztecToolbarClickListener ,
44+ HistoryListener ,
45+ OnRequestPermissionsResultCallback ,
46+ PopupMenu .OnMenuItemClickListener ,
47+ View .OnTouchListener {
4148 companion object {
4249 private val HEADING =
4350 " <h1>Heading 1</h1>" +
@@ -109,6 +116,9 @@ class MainActivity : AppCompatActivity(), OnRequestPermissionsResultCallback, Vi
109116 private lateinit var source: SourceViewEditText
110117 private lateinit var formattingToolbar: AztecToolbar
111118
119+ private lateinit var invalidateOptionsHandler: Handler
120+ private lateinit var invalidateOptionsRunnable: Runnable
121+
112122 private var addPhotoMediaDialog: AlertDialog ? = null
113123 private var addVideoMediaDialog: AlertDialog ? = null
114124 private var mediaUploadDialog: AlertDialog ? = null
@@ -123,14 +133,22 @@ class MainActivity : AppCompatActivity(), OnRequestPermissionsResultCallback, Vi
123133
124134 when (requestCode) {
125135 REQUEST_MEDIA_CAMERA_PHOTO -> {
126- bitmap = BitmapFactory .decodeFile(mediaPath)
136+ // By default, BitmapFactory.decodeFile sets the bitmap's density to the device default so, we need
137+ // to correctly set the input density to 160 ourselves.
138+ val options = BitmapFactory .Options ()
139+ options.inDensity = DisplayMetrics .DENSITY_DEFAULT
140+ bitmap = BitmapFactory .decodeFile(mediaPath, options)
127141 }
128142 REQUEST_MEDIA_CAMERA_VIDEO -> {
129143 }
130144 REQUEST_MEDIA_PHOTO -> {
131145 mediaPath = data?.data.toString()
132146 val stream = contentResolver.openInputStream(Uri .parse(mediaPath))
133- bitmap = BitmapFactory .decodeStream(stream)
147+ // By default, BitmapFactory.decodeFile sets the bitmap's density to the device default so, we need
148+ // to correctly set the input density to 160 ourselves.
149+ val options = BitmapFactory .Options ()
150+ options.inDensity = DisplayMetrics .DENSITY_DEFAULT
151+ bitmap = BitmapFactory .decodeStream(stream, null , options)
134152 }
135153 REQUEST_MEDIA_VIDEO -> {
136154 }
@@ -178,11 +196,11 @@ class MainActivity : AppCompatActivity(), OnRequestPermissionsResultCallback, Vi
178196 }
179197 }
180198
181- Handler ().post(runnable);
182- Handler ().postDelayed(runnable, 2000 );
183- Handler ().postDelayed(runnable, 4000 );
184- Handler ().postDelayed(runnable, 6000 );
185- Handler ().postDelayed(runnable, 8000 );
199+ Handler ().post(runnable)
200+ Handler ().postDelayed(runnable, 2000 )
201+ Handler ().postDelayed(runnable, 4000 )
202+ Handler ().postDelayed(runnable, 6000 )
203+ Handler ().postDelayed(runnable, 8000 )
186204
187205 aztec.refreshText()
188206 }
@@ -209,17 +227,24 @@ class MainActivity : AppCompatActivity(), OnRequestPermissionsResultCallback, Vi
209227 formattingToolbar = findViewById(R .id.formatting_toolbar) as AztecToolbar
210228 formattingToolbar.setEditor(aztec, source)
211229 formattingToolbar.setToolbarListener(this )
230+ aztec.setToolbar(formattingToolbar)
212231
213232 // initialize the text & HTML
214233 source.displayStyledAndFormattedHtml(EXAMPLE )
215- aztec.fromHtml(source.getPureHtml())
216234
217- source.history = aztec.history
235+ if (savedInstanceState == null ) {
236+ aztec.fromHtml(source.getPureHtml())
237+ source.history = aztec.history
238+ }
218239
240+ aztec.history.setHistoryListener(this )
219241 aztec.setOnImeBackListener(this )
220242 aztec.setOnTouchListener(this )
221243 source.setOnImeBackListener(this )
222244 source.setOnTouchListener(this )
245+
246+ invalidateOptionsHandler = Handler ()
247+ invalidateOptionsRunnable = Runnable { invalidateOptionsMenu() }
223248 }
224249
225250 override fun onPause () {
@@ -250,6 +275,8 @@ class MainActivity : AppCompatActivity(), OnRequestPermissionsResultCallback, Vi
250275 override fun onRestoreInstanceState (savedInstanceState : Bundle ? ) {
251276 super .onRestoreInstanceState(savedInstanceState)
252277
278+ source.history = aztec.history
279+
253280 savedInstanceState?.let {
254281 if (savedInstanceState.getBoolean(" isPhotoMediaDialogVisible" )) {
255282 showPhotoMediaDialog()
@@ -367,6 +394,22 @@ class MainActivity : AppCompatActivity(), OnRequestPermissionsResultCallback, Vi
367394 return true
368395 }
369396
397+ override fun onPrepareOptionsMenu (menu : Menu ? ): Boolean {
398+ menu?.findItem(R .id.redo)?.isEnabled = aztec.history.redoValid()
399+ menu?.findItem(R .id.undo)?.isEnabled = aztec.history.undoValid()
400+ return super .onPrepareOptionsMenu(menu)
401+ }
402+
403+ override fun onRedoEnabled () {
404+ invalidateOptionsHandler.removeCallbacks(invalidateOptionsRunnable)
405+ invalidateOptionsHandler.postDelayed(invalidateOptionsRunnable, resources.getInteger(android.R .integer.config_mediumAnimTime).toLong())
406+ }
407+
408+ override fun onUndoEnabled () {
409+ invalidateOptionsHandler.removeCallbacks(invalidateOptionsRunnable)
410+ invalidateOptionsHandler.postDelayed(invalidateOptionsRunnable, resources.getInteger(android.R .integer.config_mediumAnimTime).toLong())
411+ }
412+
370413 fun onCameraPhotoMediaOptionSelected () {
371414 if (PermissionUtils .checkAndRequestCameraAndStoragePermissions(this , MEDIA_CAMERA_PHOTO_PERMISSION_REQUEST_CODE )) {
372415 val intent = Intent (MediaStore .ACTION_IMAGE_CAPTURE )
0 commit comments