diff --git a/app/src/main/java/com/futo/platformplayer/activities/AddSourceActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/AddSourceActivity.kt index fd12528e..620df73f 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/AddSourceActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/AddSourceActivity.kt @@ -75,10 +75,10 @@ class AddSourceActivity : AppCompatActivity() { _buttonInstall = findViewById(R.id.button_install); _buttonBack.setOnClickListener { - onBackPressed(); + finish(); }; _buttonCancel.setOnClickListener { - onBackPressed(); + finish(); } _buttonInstall.setOnClickListener { _config?.let { diff --git a/app/src/main/java/com/futo/platformplayer/activities/AddSourceOptionsActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/AddSourceOptionsActivity.kt index da4a563b..e34916e4 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/AddSourceOptionsActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/AddSourceOptionsActivity.kt @@ -1,7 +1,10 @@ package com.futo.platformplayer.activities +import android.content.Intent +import android.net.Uri import android.os.Bundle import android.widget.* +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import com.futo.platformplayer.* import com.futo.platformplayer.views.buttons.BigButton @@ -14,6 +17,31 @@ class AddSourceOptionsActivity : AppCompatActivity() { lateinit var _buttonQR: BigButton; lateinit var _buttonURL: BigButton; + private val _qrCodeResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val scanResult = IntentIntegrator.parseActivityResult(result.resultCode, result.data) + scanResult?.let { + val content = it.contents + if (content == null) { + UIDialogs.toast(this, "Failed to scan QR code") + return@let + } + + val url = if (content.startsWith("https://")) { + content + } else if (content.startsWith("grayjay://plugin/")) { + content.substring("grayjay://plugin/".length) + } else { + UIDialogs.toast(this, "Not a plugin URL") + return@let; + } + + val intent = Intent(this, AddSourceActivity::class.java).apply { + data = Uri.parse(url); + }; + startActivity(intent); + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_source_options); @@ -37,8 +65,9 @@ class AddSourceOptionsActivity : AppCompatActivity() { integrator.setBeepEnabled(false) integrator.setBarcodeImageEnabled(true) integrator.setCaptureActivity(QRCaptureActivity::class.java); - integrator.initiateScan() + _qrCodeResultLauncher.launch(integrator.createScanIntent()) } + _buttonURL.onClick.subscribe { UIDialogs.toast(this, "Not implemented yet.."); } diff --git a/app/src/main/java/com/futo/platformplayer/activities/PolycentricImportProfileActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/PolycentricImportProfileActivity.kt index 2a92cbf1..68ec7609 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/PolycentricImportProfileActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/PolycentricImportProfileActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.widget.EditText import android.widget.ImageButton import android.widget.LinearLayout +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.futo.platformplayer.R @@ -14,6 +15,7 @@ import com.futo.platformplayer.setNavigationBarColorAndIcons import com.futo.platformplayer.states.StatePolycentric import com.futo.polycentric.core.* import com.google.zxing.integration.android.IntentIntegrator +import com.journeyapps.barcodescanner.CaptureActivity import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -27,6 +29,16 @@ class PolycentricImportProfileActivity : AppCompatActivity() { private lateinit var _buttonImportProfile: LinearLayout; private lateinit var _editProfile: EditText; + private val _qrCodeResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val scanResult = IntentIntegrator.parseActivityResult(result.resultCode, result.data) + scanResult?.let { + if (it.contents != null) { + val scannedUrl = it.contents + import(scannedUrl) + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_polycentric_import_profile); @@ -45,10 +57,15 @@ class PolycentricImportProfileActivity : AppCompatActivity() { }; _buttonScanProfile.setOnClickListener { - val integrator = IntentIntegrator(this); - integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE); - integrator.setPrompt("Scan a QR code"); - integrator.initiateScan(); + val integrator = IntentIntegrator(this) + integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE) + integrator.setPrompt("Scan a QR code") + integrator.setOrientationLocked(true); + integrator.setCameraId(0) + integrator.setBeepEnabled(false) + integrator.setBarcodeImageEnabled(true) + integrator.setCaptureActivity(QRCaptureActivity::class.java); + _qrCodeResultLauncher.launch(integrator.createScanIntent()) }; _buttonImportProfile.setOnClickListener { @@ -66,18 +83,6 @@ class PolycentricImportProfileActivity : AppCompatActivity() { } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data) - if (result != null) { - if (result.contents != null) { - val scannedUrl = result.contents; - import(scannedUrl); - } - } else { - super.onActivityResult(requestCode, resultCode, data) - } - } - private fun import(url: String) { if (!url.startsWith("polycentric://")) { UIDialogs.toast(this, "Not a valid URL"); @@ -126,4 +131,8 @@ class PolycentricImportProfileActivity : AppCompatActivity() { companion object { private const val TAG = "PolycentricImportProfileActivity"; } + + class QRCaptureActivity: CaptureActivity() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/comments/PolycentricPlatformComment.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/comments/PolycentricPlatformComment.kt index a07d10c9..69c92f49 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/comments/PolycentricPlatformComment.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/comments/PolycentricPlatformComment.kt @@ -39,4 +39,8 @@ class PolycentricPlatformComment : IPlatformComment { fun cloneWithUpdatedReplyCount(replyCount: Int?): PolycentricPlatformComment { return PolycentricPlatformComment(contextUrl, author, message, rating, date, reference, replyCount); } + + companion object { + val MAX_COMMENT_SIZE = 2000 + } } \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/dialogs/CommentDialog.kt b/app/src/main/java/com/futo/platformplayer/dialogs/CommentDialog.kt index f3a981be..8f724191 100644 --- a/app/src/main/java/com/futo/platformplayer/dialogs/CommentDialog.kt +++ b/app/src/main/java/com/futo/platformplayer/dialogs/CommentDialog.kt @@ -2,12 +2,16 @@ package com.futo.platformplayer.dialogs import android.app.AlertDialog import android.content.Context +import android.graphics.Color import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.WindowManager import android.view.inputmethod.InputMethodManager import android.widget.* import com.futo.platformplayer.R +import com.futo.platformplayer.UIDialogs import com.futo.platformplayer.api.media.PlatformID import com.futo.platformplayer.api.media.models.PlatformAuthorLink import com.futo.platformplayer.api.media.models.comments.IPlatformComment @@ -32,6 +36,8 @@ class CommentDialog(context: Context?, val contextUrl: String, val ref: Protocol private lateinit var _buttonCancel: MaterialButton; private lateinit var _editComment: EditText; private lateinit var _inputMethodManager: InputMethodManager; + private lateinit var _textCharacterCount: TextView; + private lateinit var _textCharacterCountMax: TextView; val onCommentAdded = Event1(); @@ -42,6 +48,26 @@ class CommentDialog(context: Context?, val contextUrl: String, val ref: Protocol _buttonCancel = findViewById(R.id.button_cancel); _buttonCreate = findViewById(R.id.button_create); _editComment = findViewById(R.id.edit_comment); + _textCharacterCount = findViewById(R.id.character_count); + _textCharacterCountMax = findViewById(R.id.character_count_max); + + _editComment.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) = Unit + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + _textCharacterCount.text = count.toString(); + + if (count > PolycentricPlatformComment.MAX_COMMENT_SIZE) { + _textCharacterCount.setTextColor(Color.RED); + _textCharacterCountMax.setTextColor(Color.RED); + _buttonCreate.alpha = 0.4f; + } else { + _textCharacterCount.setTextColor(Color.WHITE); + _textCharacterCountMax.setTextColor(Color.WHITE); + _buttonCreate.alpha = 1.0f; + } + } + }); _inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager; @@ -53,6 +79,11 @@ class CommentDialog(context: Context?, val contextUrl: String, val ref: Protocol _buttonCreate.setOnClickListener { clearFocus(); + if (_editComment.text.count() > PolycentricPlatformComment.MAX_COMMENT_SIZE) { + UIDialogs.toast(context, "Comment should be less than 5000 characters"); + return@setOnClickListener; + } + val comment = _editComment.text.toString(); val processHandle = StatePolycentric.instance.processHandle!! val eventPointer = processHandle.post(comment, null, ref) diff --git a/app/src/main/java/com/futo/platformplayer/models/Telemetry.kt b/app/src/main/java/com/futo/platformplayer/models/Telemetry.kt index ec4b9935..d1ec7757 100644 --- a/app/src/main/java/com/futo/platformplayer/models/Telemetry.kt +++ b/app/src/main/java/com/futo/platformplayer/models/Telemetry.kt @@ -9,7 +9,6 @@ data class Telemetry( val buildType: String, val debug: Boolean, val isUnstableBuild: Boolean, - val time: Long, val brand: String, val manufacturer: String, val model: String diff --git a/app/src/main/java/com/futo/platformplayer/states/StatePolycentric.kt b/app/src/main/java/com/futo/platformplayer/states/StatePolycentric.kt index 18e262c9..29a0d23d 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StatePolycentric.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StatePolycentric.kt @@ -302,7 +302,7 @@ class StatePolycentric { thumbnail = imageBundle?.selectBestImage(dp_25 * dp_25)?.let { img -> img.toURLInfoSystemLinkUrl(ev.system.toProto(), img.process, listOf(PolycentricCache.SERVER)) }, subscribers = null ), - msg = post.content, + msg = if (post.content.count() > PolycentricPlatformComment.MAX_COMMENT_SIZE) post.content.substring(0, PolycentricPlatformComment.MAX_COMMENT_SIZE) else post.content, rating = RatingLikeDislikes(likes, dislikes), date = if (unixMilliseconds != null) Instant.ofEpochMilli(unixMilliseconds).atOffset(ZoneOffset.UTC) else OffsetDateTime.MIN, replyCount = replies.toInt(), diff --git a/app/src/main/res/layout/dialog_comment.xml b/app/src/main/res/layout/dialog_comment.xml index 1c84ce23..4b9dd4c9 100644 --- a/app/src/main/res/layout/dialog_comment.xml +++ b/app/src/main/res/layout/dialog_comment.xml @@ -35,6 +35,25 @@ android:gravity="center" android:layout_marginTop="12dp"> + + + +