feat: Rewrite recordSentMessage in Kotlin
This commit is contained in:
parent
052a4e4700
commit
eab467ee1d
@ -2,13 +2,17 @@ group 'me.polynom.moxplatform_android'
|
|||||||
version '1.0'
|
version '1.0'
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
|
ext {
|
||||||
|
kotlin_version = '1.8.21'
|
||||||
|
}
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:4.1.0'
|
classpath 'com.android.tools.build:gradle:4.1.3'
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -20,6 +24,7 @@ rootProject.allprojects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'com.android.library'
|
apply plugin: 'com.android.library'
|
||||||
|
apply plugin: 'org.jetbrains.kotlin.android'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 31
|
compileSdkVersion 31
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package me.polynom.moxplatform_android;
|
package me.polynom.moxplatform_android;
|
||||||
|
|
||||||
|
import static me.polynom.moxplatform_android.RecordSentMessageKt.recordSentMessage;
|
||||||
|
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@ -204,17 +206,13 @@ public class MoxplatformAndroidPlugin extends BroadcastReceiver implements Flutt
|
|||||||
break;
|
break;
|
||||||
case "recordSentMessage":
|
case "recordSentMessage":
|
||||||
ArrayList rargs = (ArrayList) call.arguments;
|
ArrayList rargs = (ArrayList) call.arguments;
|
||||||
try {
|
|
||||||
recordSentMessage(
|
recordSentMessage(
|
||||||
|
context,
|
||||||
(String) rargs.get(0),
|
(String) rargs.get(0),
|
||||||
(String) rargs.get(1),
|
(String) rargs.get(1),
|
||||||
(String) rargs.get(2),
|
(String) rargs.get(2),
|
||||||
(int) rargs.get(3)
|
(int) rargs.get(3)
|
||||||
);
|
);
|
||||||
} catch (ClassNotFoundException ex) {
|
|
||||||
Log.e(TAG, "Failed to get classname");
|
|
||||||
Log.e(TAG, ex.getMessage());
|
|
||||||
}
|
|
||||||
result.success(true);
|
result.success(true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -223,58 +221,6 @@ public class MoxplatformAndroidPlugin extends BroadcastReceiver implements Flutt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void recordSentMessage(String name, String jid, String avatarPath, int fallbackIconType) throws ClassNotFoundException {
|
|
||||||
// Very much inspired (or copied) from https://github.com/ShoutSocial/share_handler
|
|
||||||
final String pkgName = context.getPackageName();
|
|
||||||
final Intent intent = new Intent(context, Class.forName(pkgName + ".MainActivity"));
|
|
||||||
intent.setAction(Intent.ACTION_SEND);
|
|
||||||
|
|
||||||
// Compatibility with share_handler
|
|
||||||
intent.putExtra("conversationIdentifier", jid);
|
|
||||||
|
|
||||||
final String shortcutTarget = pkgName + ".dynamic_share_target";
|
|
||||||
final ShortcutInfoCompat.Builder builder = new ShortcutInfoCompat.Builder(context, name);
|
|
||||||
builder
|
|
||||||
.setShortLabel(name)
|
|
||||||
.setIsConversation()
|
|
||||||
.setCategories(Set.of(shortcutTarget))
|
|
||||||
.setIntent(intent)
|
|
||||||
.setLongLived(true);
|
|
||||||
|
|
||||||
// TODO: This is dumb. Maybe just raise the minimum Android version
|
|
||||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
|
|
||||||
final Person.Builder personBuilder = new Person.Builder()
|
|
||||||
.setKey(jid)
|
|
||||||
.setName(name);
|
|
||||||
|
|
||||||
if (avatarPath != null) {
|
|
||||||
final Bitmap bitmap = BitmapFactory.decodeFile(avatarPath);
|
|
||||||
final IconCompat icon = IconCompat.createWithAdaptiveBitmap(bitmap);
|
|
||||||
builder.setIcon(icon);
|
|
||||||
personBuilder.setIcon(icon);
|
|
||||||
} else {
|
|
||||||
if (fallbackIconType == 0 || fallbackIconType == 1) {
|
|
||||||
final int id = switch (fallbackIconType) {
|
|
||||||
default:
|
|
||||||
case 0: yield R.mipmap.person;
|
|
||||||
case 1: yield R.mipmap.notes;
|
|
||||||
};
|
|
||||||
final IconCompat personIcon = IconCompat.createWithResource(
|
|
||||||
context,
|
|
||||||
id
|
|
||||||
);
|
|
||||||
builder.setIcon(personIcon);
|
|
||||||
personBuilder.setIcon(personIcon);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.setPerson(personBuilder.build());
|
|
||||||
}
|
|
||||||
|
|
||||||
final ShortcutInfoCompat shortcut = builder.build();
|
|
||||||
ShortcutManagerCompat.addDynamicShortcuts(context, List.of(shortcut));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
if (intent.getAction() == null) return;
|
if (intent.getAction() == null) return;
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
package me.polynom.moxplatform_android
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
|
import androidx.core.app.Person
|
||||||
|
import androidx.core.content.pm.ShortcutInfoCompat
|
||||||
|
import androidx.core.content.pm.ShortcutManagerCompat
|
||||||
|
import androidx.core.graphics.drawable.IconCompat
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Uses Android's direct share API to create dynamic share targets that are compatible
|
||||||
|
* with share_handler's media handling.
|
||||||
|
* */
|
||||||
|
fun recordSentMessage(context: Context, name: String, jid: String, avatarPath: String?, fallbackIconType: Int) {
|
||||||
|
val pkgName = context.packageName
|
||||||
|
val intent = Intent(context, Class.forName("$pkgName.MainActivity")).apply {
|
||||||
|
action = Intent.ACTION_SEND
|
||||||
|
|
||||||
|
// Compatibility with share_handler
|
||||||
|
putExtra("conversationIdentifier", jid)
|
||||||
|
}
|
||||||
|
|
||||||
|
val shortcutTarget = "$pkgName.dynamic_share_target"
|
||||||
|
val shortcutBuilder = ShortcutInfoCompat.Builder(context, name).apply {
|
||||||
|
setShortLabel(name)
|
||||||
|
setIsConversation()
|
||||||
|
setCategories(setOf(shortcutTarget))
|
||||||
|
setIntent(intent)
|
||||||
|
setLongLived(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
val personBuilder = Person.Builder().apply {
|
||||||
|
setKey(jid)
|
||||||
|
setName(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Either set an avatar image OR a fallback icon
|
||||||
|
if (avatarPath != null) {
|
||||||
|
val icon = IconCompat.createWithAdaptiveBitmap(
|
||||||
|
BitmapFactory.decodeFile(avatarPath),
|
||||||
|
)
|
||||||
|
shortcutBuilder.setIcon(icon)
|
||||||
|
personBuilder.setIcon(icon)
|
||||||
|
} else {
|
||||||
|
val resourceId = when(fallbackIconType) {
|
||||||
|
0 -> R.mipmap.person
|
||||||
|
1 -> R.mipmap.notes
|
||||||
|
// "Fallthrough"
|
||||||
|
else -> R.mipmap.person
|
||||||
|
}
|
||||||
|
val icon = IconCompat.createWithResource(context, resourceId)
|
||||||
|
shortcutBuilder.setIcon(icon)
|
||||||
|
personBuilder.setIcon(icon)
|
||||||
|
}
|
||||||
|
|
||||||
|
shortcutBuilder.setPerson(personBuilder.build())
|
||||||
|
ShortcutManagerCompat.addDynamicShortcuts(
|
||||||
|
context,
|
||||||
|
listOf(shortcutBuilder.build()),
|
||||||
|
)
|
||||||
|
}
|
Reference in New Issue
Block a user