diff --git a/res/layout/profile_create_activity.xml b/res/layout/profile_create_activity.xml index c7b0e39c6..88d634a20 100644 --- a/res/layout/profile_create_activity.xml +++ b/res/layout/profile_create_activity.xml @@ -50,7 +50,8 @@ - Comunidad Descripción + ¿Quieres unirte a la comunidad \"%1$s\"? + Establece un nombre que otros puedan reconocer. DeltaLab OK diff --git a/res/values/strings.xml b/res/values/strings.xml index 8fb330c4a..cbf347b26 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2,6 +2,8 @@ Community Description + Do you want to join the Community \"%1$s\"? + Set a name that other will recognize. Could not open file DeltaLab diff --git a/src/org/thoughtcrime/securesms/ConversationItem.java b/src/org/thoughtcrime/securesms/ConversationItem.java index 50730ff79..f94642d9f 100644 --- a/src/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/org/thoughtcrime/securesms/ConversationItem.java @@ -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); diff --git a/src/org/thoughtcrime/securesms/CreateProfileActivity.java b/src/org/thoughtcrime/securesms/CreateProfileActivity.java index f7c4f3f51..0c32d0c9e 100644 --- a/src/org/thoughtcrime/securesms/CreateProfileActivity.java +++ b/src/org/thoughtcrime/securesms/CreateProfileActivity.java @@ -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); diff --git a/src/org/thoughtcrime/securesms/WelcomeActivity.java b/src/org/thoughtcrime/securesms/WelcomeActivity.java index 204ad9ca7..927897b5c 100644 --- a/src/org/thoughtcrime/securesms/WelcomeActivity.java +++ b/src/org/thoughtcrime/securesms/WelcomeActivity.java @@ -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(); diff --git a/src/org/thoughtcrime/securesms/components/WebxdcView.java b/src/org/thoughtcrime/securesms/components/WebxdcView.java index a93904673..a8a6e8637 100644 --- a/src/org/thoughtcrime/securesms/components/WebxdcView.java +++ b/src/org/thoughtcrime/securesms/components/WebxdcView.java @@ -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;