mirror of
https://github.com/oxen-io/session-android.git
synced 2025-10-25 07:59:38 +00:00
Profile creation activity
// FREEBIE
This commit is contained in:
@@ -72,6 +72,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
initializeContactUpdatesReceiver();
|
||||
|
||||
Intent intent = new Intent(this, CreateProfileActivity.class);
|
||||
startActivity(intent);
|
||||
|
||||
RatingManager.showRatingDialogIfNecessary(this);
|
||||
}
|
||||
|
||||
|
||||
267
src/org/thoughtcrime/securesms/CreateProfileActivity.java
Normal file
267
src/org/thoughtcrime/securesms/CreateProfileActivity.java
Normal file
@@ -0,0 +1,267 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.provider.MediaStore;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.soundcloud.android.crop.Crop;
|
||||
|
||||
import org.thoughtcrime.securesms.components.InputAwareLayout;
|
||||
import org.thoughtcrime.securesms.components.emoji.EmojiDrawer;
|
||||
import org.thoughtcrime.securesms.components.emoji.EmojiToggle;
|
||||
import org.thoughtcrime.securesms.contacts.avatars.ContactPhotoFactory;
|
||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||
import org.thoughtcrime.securesms.dependencies.InjectableType;
|
||||
import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints;
|
||||
import org.thoughtcrime.securesms.profiles.SystemProfileUtil;
|
||||
import org.thoughtcrime.securesms.util.Base64;
|
||||
import org.thoughtcrime.securesms.util.BitmapDecodingException;
|
||||
import org.thoughtcrime.securesms.util.BitmapUtil;
|
||||
import org.thoughtcrime.securesms.util.IntentUtils;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture;
|
||||
import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask;
|
||||
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
|
||||
import org.whispersystems.signalservice.api.util.StreamDetails;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class CreateProfileActivity extends PassphraseRequiredActionBarActivity implements InjectableType {
|
||||
|
||||
private static final String TAG = CreateProfileActivity.class.getSimpleName();
|
||||
|
||||
private static final int REQUEST_CODE_AVATAR = 1;
|
||||
|
||||
@Inject SignalServiceAccountManager accountManager;
|
||||
|
||||
private InputAwareLayout container;
|
||||
private ImageView avatar;
|
||||
private Button finishButton;
|
||||
private EditText name;
|
||||
private EmojiToggle emojiToggle;
|
||||
private EmojiDrawer emojiDrawer;
|
||||
|
||||
private byte[] avatarBytes;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle bundle, @NonNull MasterSecret masterSecret) {
|
||||
super.onCreate(bundle, masterSecret);
|
||||
|
||||
setContentView(R.layout.profile_create_activity);
|
||||
|
||||
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
|
||||
getSupportActionBar().setTitle("Your profile info");
|
||||
|
||||
initializeResources();
|
||||
initializeEmojiInput();
|
||||
initializeDeviceOwner();
|
||||
|
||||
ApplicationContext.getInstance(this).injectDependencies(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (container.isInputOpen()) container.hideCurrentInput(name);
|
||||
else super.onBackPressed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
|
||||
if (container.getCurrentInput() == emojiDrawer) {
|
||||
container.hideAttachedInput(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
||||
switch (requestCode) {
|
||||
case REQUEST_CODE_AVATAR:
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
Uri outputFile = Uri.fromFile(new File(getCacheDir(), "cropped"));
|
||||
new Crop(data.getData()).output(outputFile).asSquare().start(this);
|
||||
}
|
||||
|
||||
break;
|
||||
case Crop.REQUEST_CROP:
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
try {
|
||||
avatarBytes = BitmapUtil.createScaledBytes(this, Crop.getOutput(data), new ProfileMediaConstraints());
|
||||
avatar.setImageDrawable(ContactPhotoFactory.getGroupContactPhoto(avatarBytes).asDrawable(this, 0));
|
||||
} catch (BitmapDecodingException e) {
|
||||
Log.w(TAG, e);
|
||||
Toast.makeText(this, "Error setting profile photo", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeResources() {
|
||||
this.avatar = ViewUtil.findById(this, R.id.avatar);
|
||||
this.name = ViewUtil.findById(this, R.id.name);
|
||||
this.emojiToggle = ViewUtil.findById(this, R.id.emoji_toggle);
|
||||
this.emojiDrawer = ViewUtil.findById(this, R.id.emoji_drawer);
|
||||
this.container = ViewUtil.findById(this, R.id.container);
|
||||
this.finishButton = ViewUtil.findById(this, R.id.finish_button);
|
||||
|
||||
this.avatar.setImageDrawable(ContactPhotoFactory.getResourceContactPhoto(R.drawable.ic_camera_alt_white_24dp)
|
||||
.asDrawable(this, getResources().getColor(R.color.grey_400)));
|
||||
|
||||
this.avatar.setOnClickListener(view -> {
|
||||
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
|
||||
galleryIntent.setType("image/*");
|
||||
|
||||
if (!IntentUtils.isResolvable(CreateProfileActivity.this, galleryIntent)) {
|
||||
galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
galleryIntent.setType("image/*");
|
||||
}
|
||||
|
||||
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
||||
Intent chooserIntent = Intent.createChooser(galleryIntent, "Profile photo");
|
||||
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { cameraIntent });
|
||||
|
||||
startActivityForResult(chooserIntent, REQUEST_CODE_AVATAR);
|
||||
});
|
||||
|
||||
this.finishButton.setOnClickListener(view -> {
|
||||
handleUpload();
|
||||
});
|
||||
}
|
||||
|
||||
private void initializeDeviceOwner() {
|
||||
SystemProfileUtil.getSystemProfileName(this).addListener(new ListenableFuture.Listener<String>() {
|
||||
@Override
|
||||
public void onSuccess(String result) {
|
||||
if (!TextUtils.isEmpty(result)) {
|
||||
name.setText(result);
|
||||
name.setSelection(result.length(), result.length());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(ExecutionException e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
});
|
||||
|
||||
SystemProfileUtil.getSystemProfileAvatar(this, new ProfileMediaConstraints()).addListener(new ListenableFuture.Listener<byte[]>() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
if (result != null) {
|
||||
avatarBytes = result;
|
||||
avatar.setImageDrawable(ContactPhotoFactory.getGroupContactPhoto(result).asDrawable(CreateProfileActivity.this, 0));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(ExecutionException e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initializeEmojiInput() {
|
||||
this.emojiToggle.attach(emojiDrawer);
|
||||
|
||||
this.emojiToggle.setOnClickListener(v -> {
|
||||
if (container.getCurrentInput() == emojiDrawer) {
|
||||
container.showSoftkey(name);
|
||||
} else {
|
||||
container.show(name, emojiDrawer);
|
||||
}
|
||||
});
|
||||
|
||||
this.emojiDrawer.setEmojiEventListener(new EmojiDrawer.EmojiEventListener() {
|
||||
@Override
|
||||
public void onKeyEvent(KeyEvent keyEvent) {
|
||||
name.dispatchKeyEvent(keyEvent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEmojiSelected(String emoji) {
|
||||
final int start = name.getSelectionStart();
|
||||
final int end = name.getSelectionEnd();
|
||||
|
||||
name.getText().replace(Math.min(start, end), Math.max(start, end), emoji);
|
||||
name.setSelection(start + emoji.length());
|
||||
}
|
||||
});
|
||||
|
||||
this.container.addOnKeyboardShownListener(() -> emojiToggle.setToEmoji());
|
||||
this.name.setOnClickListener(v -> container.showSoftkey(name));
|
||||
}
|
||||
|
||||
private void handleUpload() {
|
||||
final String name;
|
||||
final StreamDetails avatar;
|
||||
|
||||
if (TextUtils.isEmpty(this.name.getText().toString())) name = null;
|
||||
else name = this.name.getText().toString();
|
||||
|
||||
if (avatarBytes == null || avatarBytes.length == 0) avatar = null;
|
||||
else avatar = new StreamDetails(new ByteArrayInputStream(avatarBytes),
|
||||
"image/jpeg", avatarBytes.length);
|
||||
|
||||
new ProgressDialogAsyncTask<Void, Void, Boolean>(this, "Updating and encrypting profile", "Updating profile") {
|
||||
@Override
|
||||
protected Boolean doInBackground(Void... params) {
|
||||
String encodedProfileKey = TextSecurePreferences.getProfileKey(CreateProfileActivity.this);
|
||||
|
||||
if (encodedProfileKey == null) {
|
||||
encodedProfileKey = Util.getSecret(32);
|
||||
TextSecurePreferences.setProfileKey(CreateProfileActivity.this, encodedProfileKey);
|
||||
}
|
||||
|
||||
try {
|
||||
accountManager.setProfileName(Base64.decode(encodedProfileKey), name);
|
||||
} catch (IOException e) {
|
||||
Log.w(TAG, e);
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
accountManager.setProfileAvatar(Base64.decode(encodedProfileKey), avatar);;
|
||||
} catch (IOException e) {
|
||||
Log.w(TAG, e);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPostExecute(Boolean result) {
|
||||
super.onPostExecute(result);
|
||||
|
||||
if (result) finish();
|
||||
else Toast.makeText(CreateProfileActivity.this, "Problem setting profile", Toast.LENGTH_LONG).show();;
|
||||
}
|
||||
}.execute();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.dependencies;
|
||||
import android.content.Context;
|
||||
|
||||
import org.thoughtcrime.securesms.BuildConfig;
|
||||
import org.thoughtcrime.securesms.CreateProfileActivity;
|
||||
import org.thoughtcrime.securesms.DeviceListFragment;
|
||||
import org.thoughtcrime.securesms.crypto.storage.SignalProtocolStoreImpl;
|
||||
import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob;
|
||||
@@ -63,7 +64,8 @@ import dagger.Provides;
|
||||
RotateSignedPreKeyJob.class,
|
||||
WebRtcCallService.class,
|
||||
RetrieveProfileJob.class,
|
||||
MultiDeviceVerifiedUpdateJob.class})
|
||||
MultiDeviceVerifiedUpdateJob.class,
|
||||
CreateProfileActivity.class})
|
||||
public class SignalCommunicationModule {
|
||||
|
||||
private final Context context;
|
||||
|
||||
@@ -17,8 +17,8 @@ import org.whispersystems.libsignal.IdentityKey;
|
||||
import org.whispersystems.libsignal.InvalidKeyException;
|
||||
import org.whispersystems.signalservice.api.SignalServiceMessagePipe;
|
||||
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
|
||||
import org.whispersystems.signalservice.api.profiles.SignalServiceProfile;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceProfile;
|
||||
import org.whispersystems.signalservice.api.util.InvalidNumberException;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package org.thoughtcrime.securesms.profiles;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.thoughtcrime.securesms.mms.MediaConstraints;
|
||||
|
||||
public class ProfileMediaConstraints extends MediaConstraints {
|
||||
@Override
|
||||
public int getImageMaxWidth(Context context) {
|
||||
return 640;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getImageMaxHeight(Context context) {
|
||||
return 640;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getImageMaxSize(Context context) {
|
||||
return 5 * 1024 * 1024;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getGifMaxSize(Context context) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getVideoMaxSize(Context context) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAudioMaxSize(Context context) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDocumentMaxSize(Context context) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
110
src/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java
Normal file
110
src/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java
Normal file
@@ -0,0 +1,110 @@
|
||||
package org.thoughtcrime.securesms.profiles;
|
||||
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountManager;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.provider.ContactsContract;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.bumptech.glide.load.data.StreamLocalUriFetcher;
|
||||
|
||||
import org.thoughtcrime.securesms.mms.MediaConstraints;
|
||||
import org.thoughtcrime.securesms.util.BitmapDecodingException;
|
||||
import org.thoughtcrime.securesms.util.BitmapUtil;
|
||||
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture;
|
||||
import org.thoughtcrime.securesms.util.concurrent.SettableFuture;
|
||||
|
||||
public class SystemProfileUtil {
|
||||
|
||||
private static final String TAG = SystemProfileUtil.class.getSimpleName();
|
||||
|
||||
public static ListenableFuture<byte[]> getSystemProfileAvatar(final @NonNull Context context, MediaConstraints mediaConstraints) {
|
||||
SettableFuture<byte[]> future = new SettableFuture<>();
|
||||
|
||||
new AsyncTask<Void, Void, byte[]>() {
|
||||
@Override
|
||||
protected @Nullable byte[] doInBackground(Void... params) {
|
||||
if (Build.VERSION.SDK_INT >= 14) {
|
||||
try (Cursor cursor = context.getContentResolver().query(ContactsContract.Profile.CONTENT_URI, null, null, null, null)) {
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
String photoUri = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Profile.PHOTO_URI));
|
||||
|
||||
if (!TextUtils.isEmpty(photoUri)) {
|
||||
try {
|
||||
return BitmapUtil.createScaledBytes(context, Uri.parse(photoUri), mediaConstraints);
|
||||
} catch (BitmapDecodingException e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(@Nullable byte[] result) {
|
||||
future.set(result);
|
||||
}
|
||||
|
||||
}.execute();
|
||||
|
||||
return future;
|
||||
}
|
||||
|
||||
public static ListenableFuture<String> getSystemProfileName(final @NonNull Context context) {
|
||||
SettableFuture<String> future = new SettableFuture<>();
|
||||
|
||||
new AsyncTask<Void, Void, String>() {
|
||||
@Override
|
||||
protected String doInBackground(Void... params) {
|
||||
String name = null;
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 14) {
|
||||
try (Cursor cursor = context.getContentResolver().query(ContactsContract.Profile.CONTENT_URI, null, null, null, null)) {
|
||||
if (cursor != null && cursor.moveToNext()) {
|
||||
name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Profile.DISPLAY_NAME));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (name == null) {
|
||||
AccountManager accountManager = AccountManager.get(context);
|
||||
Account[] accounts = accountManager.getAccountsByType("com.google");
|
||||
|
||||
for (Account account : accounts) {
|
||||
if (!TextUtils.isEmpty(account.name)) {
|
||||
if (account.name.contains("@")) {
|
||||
name = account.name.substring(0, account.name.indexOf("@")).replace('.', ' ');
|
||||
} else {
|
||||
name = account.name.replace('.', ' ');
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(@Nullable String result) {
|
||||
future.set(result);
|
||||
}
|
||||
}.execute();
|
||||
|
||||
return future;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,18 +1,14 @@
|
||||
package org.thoughtcrime.securesms.push;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Log;
|
||||
|
||||
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
|
||||
import com.google.android.gms.common.GooglePlayServicesRepairableException;
|
||||
import com.google.android.gms.security.ProviderInstaller;
|
||||
|
||||
import org.thoughtcrime.securesms.BuildConfig;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
|
||||
import org.whispersystems.signalservice.internal.push.SignalServiceUrl;
|
||||
|
||||
public class AccountManagerFactory {
|
||||
|
||||
|
||||
@@ -2,13 +2,14 @@ package org.thoughtcrime.securesms.push;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import org.thoughtcrime.securesms.BuildConfig;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.whispersystems.signalservice.api.push.TrustStore;
|
||||
import org.whispersystems.signalservice.internal.push.SignalServiceUrl;
|
||||
import org.whispersystems.signalservice.internal.configuration.SignalCdnUrl;
|
||||
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration;
|
||||
import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@@ -93,9 +94,9 @@ public class SignalServiceNetworkAccess {
|
||||
.build();
|
||||
|
||||
|
||||
private final Map<String, SignalServiceUrl[]> censorshipConfiguration;
|
||||
private final String[] censoredCountries;
|
||||
private final SignalServiceUrl[] uncensoredConfiguration;
|
||||
private final Map<String, SignalServiceConfiguration> censorshipConfiguration;
|
||||
private final String[] censoredCountries;
|
||||
private final SignalServiceConfiguration uncensoredConfiguration;
|
||||
|
||||
public SignalServiceNetworkAccess(Context context) {
|
||||
final TrustStore googleTrustStore = new GoogleFrontingTrustStore(context);
|
||||
@@ -105,41 +106,43 @@ public class SignalServiceNetworkAccess {
|
||||
final SignalServiceUrl mapsTwoAndroid = new SignalServiceUrl("https://clients4.google.com", APPSPOT_REFLECTOR_HOST, googleTrustStore, GMAPS_CONNECTION_SPEC);
|
||||
final SignalServiceUrl mailAndroid = new SignalServiceUrl("https://mail.google.com", APPSPOT_REFLECTOR_HOST, googleTrustStore, GMAIL_CONNECTION_SPEC);
|
||||
|
||||
this.censorshipConfiguration = new HashMap<String, SignalServiceUrl[]>() {{
|
||||
put("+20", new SignalServiceUrl[] {new SignalServiceUrl("https://www.google.com.eg",
|
||||
APPSPOT_REFLECTOR_HOST,
|
||||
googleTrustStore, GMAIL_CONNECTION_SPEC),
|
||||
baseAndroid, mapsOneAndroid, mapsTwoAndroid, mailAndroid});
|
||||
this.censorshipConfiguration = new HashMap<String, SignalServiceConfiguration>() {{
|
||||
put("+20", new SignalServiceConfiguration(new SignalServiceUrl[] {new SignalServiceUrl("https://www.google.com.eg",
|
||||
APPSPOT_REFLECTOR_HOST,
|
||||
googleTrustStore, GMAIL_CONNECTION_SPEC),
|
||||
baseAndroid, mapsOneAndroid, mapsTwoAndroid, mailAndroid},
|
||||
new SignalCdnUrl[] {})); // XXX
|
||||
|
||||
put("+971", new SignalServiceUrl[] {new SignalServiceUrl("https://www.google.ae",
|
||||
APPSPOT_REFLECTOR_HOST,
|
||||
googleTrustStore, GMAIL_CONNECTION_SPEC),
|
||||
baseAndroid, baseGoogle, mapsOneAndroid, mapsTwoAndroid, mailAndroid});
|
||||
put("+971", new SignalServiceConfiguration(new SignalServiceUrl[] {new SignalServiceUrl("https://www.google.ae",
|
||||
APPSPOT_REFLECTOR_HOST,
|
||||
googleTrustStore, GMAIL_CONNECTION_SPEC),
|
||||
baseAndroid, baseGoogle, mapsOneAndroid, mapsTwoAndroid, mailAndroid},
|
||||
new SignalCdnUrl[] {})); // XXX
|
||||
|
||||
// put("+53", new SignalServiceUrl[] {new SignalServiceUrl("https://www.google.com.cu",
|
||||
// APPSPOT_REFLECTOR_HOST,
|
||||
// googleTrustStore, GMAIL_CONNECTION_SPEC),
|
||||
// baseAndroid, baseGoogle, mapsOneAndroid, mapsTwoAndroid, mailAndroid});
|
||||
|
||||
put("+968", new SignalServiceUrl[] {new SignalServiceUrl("https://www.google.com.om",
|
||||
APPSPOT_REFLECTOR_HOST,
|
||||
googleTrustStore, GMAIL_CONNECTION_SPEC),
|
||||
baseAndroid, baseGoogle, mapsOneAndroid, mapsTwoAndroid, mailAndroid});
|
||||
put("+968", new SignalServiceConfiguration(new SignalServiceUrl[] {new SignalServiceUrl("https://www.google.com.om",
|
||||
APPSPOT_REFLECTOR_HOST,
|
||||
googleTrustStore, GMAIL_CONNECTION_SPEC),
|
||||
baseAndroid, baseGoogle, mapsOneAndroid, mapsTwoAndroid, mailAndroid},
|
||||
new SignalCdnUrl[] {})); // XXX
|
||||
}};
|
||||
|
||||
this.uncensoredConfiguration = new SignalServiceUrl[] {
|
||||
new SignalServiceUrl(BuildConfig.SIGNAL_URL, new SignalServiceTrustStore(context))
|
||||
};
|
||||
this.uncensoredConfiguration = new SignalServiceConfiguration(new SignalServiceUrl[] {new SignalServiceUrl(BuildConfig.SIGNAL_URL, new SignalServiceTrustStore(context))},
|
||||
new SignalCdnUrl[] {new SignalCdnUrl(BuildConfig.SIGNAL_CDN_URL, new SignalServiceTrustStore(context))});
|
||||
|
||||
this.censoredCountries = this.censorshipConfiguration.keySet().toArray(new String[0]);
|
||||
}
|
||||
|
||||
public SignalServiceUrl[] getConfiguration(Context context) {
|
||||
public SignalServiceConfiguration getConfiguration(Context context) {
|
||||
String localNumber = TextSecurePreferences.getLocalNumber(context);
|
||||
return getConfiguration(localNumber);
|
||||
}
|
||||
|
||||
public SignalServiceUrl[] getConfiguration(@Nullable String localNumber) {
|
||||
public SignalServiceConfiguration getConfiguration(@Nullable String localNumber) {
|
||||
if (localNumber == null) return this.uncensoredConfiguration;
|
||||
|
||||
for (String censoredRegion : this.censoredCountries) {
|
||||
|
||||
18
src/org/thoughtcrime/securesms/util/IntentUtils.java
Normal file
18
src/org/thoughtcrime/securesms/util/IntentUtils.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package org.thoughtcrime.securesms.util;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class IntentUtils {
|
||||
|
||||
public static boolean isResolvable(@NonNull Context context, @NonNull Intent intent) {
|
||||
List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentActivities(intent, 0);
|
||||
return resolveInfoList != null && resolveInfoList.size() > 1;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import android.preference.PreferenceManager;
|
||||
import android.provider.Settings;
|
||||
import android.support.annotation.ArrayRes;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.util.Log;
|
||||
|
||||
@@ -109,6 +110,15 @@ public class TextSecurePreferences {
|
||||
private static final String MULTI_DEVICE_PROVISIONED_PREF = "pref_multi_device";
|
||||
public static final String DIRECT_CAPTURE_CAMERA_ID = "pref_direct_capture_camera_id";
|
||||
private static final String ALWAYS_RELAY_CALLS_PREF = "pref_turn_only";
|
||||
private static final String PROFILE_KEY_PREF = "pref_profile_key";
|
||||
|
||||
public static @Nullable String getProfileKey(Context context) {
|
||||
return getStringPreference(context, PROFILE_KEY_PREF, null);
|
||||
}
|
||||
|
||||
public static void setProfileKey(Context context, String key) {
|
||||
setStringPreference(context, PROFILE_KEY_PREF, key);
|
||||
}
|
||||
|
||||
public static int getNotificationPriority(Context context) {
|
||||
return Integer.valueOf(getStringPreference(context, NOTIFICATION_PRIORITY_PREF, String.valueOf(NotificationCompat.PRIORITY_HIGH)));
|
||||
|
||||
Reference in New Issue
Block a user