display xdc community files

This commit is contained in:
adbenitez
2024-05-18 16:56:45 +02:00
parent 023578fa6e
commit b4cddd2c28
7 changed files with 82 additions and 14 deletions
+2 -1
View File
@@ -50,7 +50,8 @@
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
<LinearLayout android:id="@+id/avatar_and_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
+2
View File
@@ -2,6 +2,8 @@
<resources>
<string name="community">Comunidad</string>
<string name="description">Descripción</string>
<string name="ask_join_community">¿Quieres unirte a la comunidad \"%1$s\"?</string>
<string name="community_set_name_explain">Establece un nombre que otros puedan reconocer.</string>
<!-- common strings without special context -->
<string name="app_name">DeltaLab</string>
<string name="ok">OK</string>
+2
View File
@@ -2,6 +2,8 @@
<resources>
<string name="community">Community</string>
<string name="description">Description</string>
<string name="ask_join_community">Do you want to join the Community \"%1$s\"?</string>
<string name="community_set_name_explain">Set a name that other will recognize.</string>
<string name="could_not_open_file">Could not open file</string>
<!-- common strings without special context -->
<string name="app_name">DeltaLab</string>
@@ -22,6 +22,7 @@ import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Build;
import android.text.Spannable;
import android.text.TextUtils;
@@ -32,10 +33,12 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.DimenRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContact;
@@ -43,6 +46,7 @@ import com.b44t.messenger.DcMsg;
import com.b44t.messenger.rpc.Reactions;
import com.b44t.messenger.rpc.RpcException;
import org.json.JSONObject;
import org.thoughtcrime.securesms.audio.AudioSlidePlayer;
import org.thoughtcrime.securesms.components.AudioView;
import org.thoughtcrime.securesms.components.AvatarImageView;
@@ -62,8 +66,10 @@ import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.mms.SlideClickListener;
import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.mms.StickerSlide;
import org.thoughtcrime.securesms.providers.PersistentBlobProvider;
import org.thoughtcrime.securesms.reactions.ReactionsConversationView;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.JsonUtils;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
import org.thoughtcrime.securesms.util.MarkdownUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
@@ -414,10 +420,14 @@ public class ConversationItem extends BaseConversationItem
} else if (messageRecord.getType() == DcMsg.DC_MSG_WEBXDC) {
msgActionButton.setVisibility(View.VISIBLE);
msgActionButton.setEnabled(true);
msgActionButton.setText(R.string.start_app);
msgActionButton.setText(webxdcViewStub.get().isCommunity()? R.string.join: R.string.start_app);
msgActionButton.setOnClickListener(view -> {
if (batchSelected.isEmpty()) {
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord);
if (webxdcViewStub.get().isCommunity()) {
joinCommunity(messageRecord);
} else {
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord);
}
} else {
passthroughClickListener.onClick(view);
}
@@ -629,6 +639,29 @@ public class ConversationItem extends BaseConversationItem
mediaThumbnailStub.get().setOutlineCorners(topLeft, topRight, bottomRight, bottomLeft);
}
private void joinCommunity(DcMsg dcMsg) {
JSONObject info = dcMsg.getWebxdcInfo();
String name = JsonUtils.optString(info, "name");
new AlertDialog.Builder(getContext())
.setMessage(getContext().getString(R.string.ask_join_community, name))
.setPositiveButton(R.string.yes, (dialog, which) -> {
String filename = "backup.tar";
byte[] blob = dcMsg.getWebxdcBlob(filename);
if (blob == null) {
Toast.makeText(getContext(), "invalid community file", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent(getContext(), WelcomeActivity.class);
String mimeType = "application/octet-stream";
Uri uri = PersistentBlobProvider.getInstance().create(getContext(), blob, mimeType, filename);
intent.setType(mimeType);
intent.putExtra(WelcomeActivity.COMMUNITY_EXTRA, uri);
getContext().startActivity(intent);
})
.setNegativeButton(R.string.no, null)
.show();
}
private void setContactPhoto() {
if (contactPhoto == null) return;
@@ -852,7 +885,7 @@ public class ConversationItem extends BaseConversationItem
if (shouldInterceptClicks(messageRecord) || !batchSelected.isEmpty()) {
performClick();
} else if (messageRecord.getType() == DcMsg.DC_MSG_WEBXDC) {
WebxdcActivity.openWebxdcActivity(context, messageRecord);
msgActionButton.performClick();
} else if (MediaPreviewActivity.isTypeSupported(slide) && slide.getUri() != null) {
Intent intent = new Intent(context, MediaPreviewActivity.class);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -211,8 +211,13 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
this.statusView = ViewUtil.findById(this, R.id.status_text);
if (fromWelcome) {
String addr = DcHelper.get(this, "addr");
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
if (DcHelper.getContext(this).isCommunity()) {
ViewUtil.findById(this, R.id.community_user_container).setVisibility(View.VISIBLE);
loginSuccessText.setText(R.string.community_set_name_explain);
ViewUtil.findById(this, R.id.avatar_and_name).setVisibility(View.GONE);
} else {
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
}
ViewUtil.findById(this, R.id.status_text_layout).setVisibility(View.GONE);
ViewUtil.findById(this, R.id.information_label).setVisibility(View.GONE);
} else {
@@ -289,10 +294,12 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
}
private void updateProfile() {
if (TextUtils.isEmpty(this.name.getText())) {
boolean isCommunity = DcHelper.getContext(context).isCommunity();
if (TextUtils.isEmpty(this.name.getText()) && !(isCommunity && fromWelcome)) {
Toast.makeText(this, R.string.please_enter_name, Toast.LENGTH_LONG).show();
return;
}
final String name = this.name.getText().toString();
final String ovName = this.overridenName.getText().toString().trim();
@@ -300,7 +307,7 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
@Override
protected Boolean doInBackground(Void... params) {
Context context = CreateProfileActivity.this;
if (DcHelper.getContext(context).isCommunity()) {
if (isCommunity) {
DcHelper.getContext(context).setCommunityUser(ovName);
}
DcHelper.set(context, DcHelper.CONFIG_DISPLAY_NAME, name);
@@ -51,6 +51,7 @@ import java.io.OutputStream;
public class WelcomeActivity extends BaseActionBarActivity implements DcEventCenter.DcEventDelegate {
public static final String BACKUP_QR_EXTRA = "backup_qr_extra";
public static final String COMMUNITY_EXTRA = "community_extra";
public static final int PICK_BACKUP = 20574;
private final static String TAG = WelcomeActivity.class.getSimpleName();
public static final String TMP_BACKUP_FILE = "tmp-backup-file";
@@ -60,6 +61,7 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
private boolean imexUserAborted;
DcContext dcContext;
private NotificationController notificationController;
private Uri communityUri;
@Override
public void onCreate(Bundle bundle) {
@@ -141,6 +143,10 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
@Override
public void onStart() {
super.onStart();
communityUri = getIntent().getParcelableExtra(COMMUNITY_EXTRA);
if (communityUri != null) {
startImport(null, communityUri, false);
}
String backupQr = getIntent().getStringExtra(BACKUP_QR_EXTRA);
if (backupQr != null) {
getIntent().removeExtra(BACKUP_QR_EXTRA);
@@ -329,9 +335,15 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
private void progressSuccess() {
DcHelper.getEventCenter(this).endCaptureNextError();
progressDialog.dismiss();
Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class);
intent.putExtra(ConversationListActivity.FROM_WELCOME, true);
startActivity(intent);
if (dcContext.isCommunity()) {
Intent intent = new Intent(getApplicationContext(), CreateProfileActivity.class);
intent.putExtra(CreateProfileActivity.FROM_WELCOME, true);
startActivity(intent);
} else {
Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class);
intent.putExtra(ConversationListActivity.FROM_WELCOME, true);
startActivity(intent);
}
finish();
}
@@ -376,6 +388,10 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
notificationController.setProgress(1000, progress, String.format(" %d%%", (int) progress / 10));
}
else if (progress==1000/*done*/) {
if (communityUri != null) dcContext.setCommunityMode(true);
if (dcContext.isCommunity()) {
dcContext.setCommunityUser(null);
}
DcHelper.getAccounts(this).startIo();
progressSuccess();
notificationController.close();
@@ -34,6 +34,7 @@ public class WebxdcView extends FrameLayout {
private final @NonNull TextView appSubtitle;
private @Nullable SlideClickListener viewListener;
private boolean isCommunity;
public WebxdcView(@NonNull Context context) {
this(context, null);
@@ -66,6 +67,7 @@ public class WebxdcView extends FrameLayout {
public void setWebxdc(final @NonNull DcMsg dcMsg, String defaultSummary)
{
JSONObject info = dcMsg.getWebxdcInfo();
isCommunity = JsonUtils.optBoolean(info, "community");
setOnClickListener(new OpenClickedListener(getContext(), dcMsg));
// icon
@@ -84,15 +86,20 @@ public class WebxdcView extends FrameLayout {
// subtitle
String summary = info.optString("summary");
if (summary.isEmpty()) {
summary = defaultSummary;
summary = isCommunity? getContext().getString(R.string.community) : defaultSummary;
}
appSubtitle.setText(summary);
}
public boolean isCommunity() {
return isCommunity;
}
public String getDescription() {
String desc = getContext().getString(R.string.webxdc_app);
String type = getContext().getString(isCommunity? R.string.community : R.string.webxdc_app);
String desc = type;
desc += "\n" + appName.getText();
if (appSubtitle.getText() != null && !appSubtitle.getText().toString().equals("") && !appSubtitle.getText().toString().equals(getContext().getString(R.string.webxdc_app))) {
if (appSubtitle.getText() != null && !appSubtitle.getText().toString().equals("") && !appSubtitle.getText().toString().equals(type)) {
desc += "\n" + appSubtitle.getText();
}
return desc;