Merge branch 'develop'

This commit is contained in:
tom79 2019-05-08 18:18:17 +02:00
commit 683a304d37
73 changed files with 1668 additions and 1217 deletions

View File

@ -39,6 +39,7 @@
Lead developer: [@tom79](https://mastodon.social/@tom79)
<br>
Developer: [@kasun](https://mastodon.social/@kasun)
## Backers

View File

@ -7,9 +7,11 @@ android {
applicationId "fr.gouv.etalab.mastodon"
minSdkVersion 16
targetSdkVersion 28
versionCode 260
versionName "1.80.3"
versionCode 261
versionName "1.80.4"
multiDexEnabled true
renderscriptTargetApi 28 as int
renderscriptSupportModeEnabled true
}
dexOptions {
javaMaxHeapSize "4g"
@ -95,5 +97,6 @@ dependencies {
implementation 'com.jaredrummler:material-spinner:1.3.1'
implementation "com.tonyodev.fetch2:fetch2:2.3.6"
implementation 'com.github.stom79:horizontalbargraph:1.5'
implementation 'jp.wasabeef:glide-transformations:4.0.0'
playstoreImplementation "io.github.kobakei:ratethisapp:$ratethisappLibraryVersion"
}

View File

@ -177,6 +177,7 @@ import static fr.gouv.etalab.mastodon.sqlite.Sqlite.importDB;
public abstract class BaseMainActivity extends BaseActivity
implements NavigationView.OnNavigationItemSelectedListener, OnUpdateAccountInfoInterface, OnRetrieveMetaDataInterface, OnRetrieveInstanceInterface, OnRetrieveRemoteAccountInterface, OnRetrieveEmojiAccountInterface, OnFilterActionInterface, OnSyncTimelineInterface {
private FloatingActionButton toot, delete_all, add_new;
private HashMap<String, String> tagTile = new HashMap<>();
private HashMap<String, Integer> tagItem = new HashMap<>();
@ -204,8 +205,7 @@ public abstract class BaseMainActivity extends BaseActivity
private final int PICK_IMPORT = 5556;
private AlertDialog.Builder dialogBuilderOptin;
private List<ManageTimelines> timelines;
private FetchConfiguration fetchConfiguration;
private Fetch fetch;
public static HashMap<Integer, Fragment> mPageReferenceMap = new HashMap<>();
private static boolean notificationChecked = false;
@ -254,7 +254,6 @@ public abstract class BaseMainActivity extends BaseActivity
finish();
return;
}
initializeDownload();
final int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
switch (theme){
case Helper.THEME_LIGHT:
@ -650,10 +649,39 @@ public abstract class BaseMainActivity extends BaseActivity
query= query.replaceAll("^#+", "");
//It's not a peertube search
if(displayPeertube == null){
//Peertube search
if(tabLayout != null && timelines != null && (timelines.get(tabLayout.getSelectedTabPosition()).getType() == ManageTimelines.Type.PEERTUBE || (timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance() != null && timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance().getType().equals("PEERTUBE")))){
DisplayStatusFragment statusFragment;
Bundle bundle = new Bundle();
statusFragment = new DisplayStatusFragment();
bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE);
String instance = "peertube.social";
if(timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance() != null && timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance().getType().equals("PEERTUBE"))
instance = timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance().getHost();
bundle.putString("remote_instance", instance);
bundle.putString("instanceType", "PEERTUBE");
bundle.putString("search_peertube", query);
statusFragment.setArguments(bundle);
String fragmentTag = "REMOTE_INSTANCE";
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.main_app_container, statusFragment, fragmentTag).commit();
if( main_app_container.getVisibility() == View.GONE){
main_app_container.setVisibility(View.VISIBLE);
toolbarTitle.setVisibility(View.VISIBLE);
delete_instance.setVisibility(View.VISIBLE);
viewPager.setVisibility(View.GONE);
tabLayout.setVisibility(View.GONE);
}
}else{
if( social != UpdateAccountInfoAsyncTask.SOCIAL.GNU) {
boolean isAccount = false;
if( query.split("@").length > 1 ){
isAccount = true;
}
if( (social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA)
&& !query.contains("http://") && !query.contains("https://")){
&& !query.contains("http://") && !query.contains("https://") && !isAccount){
Intent intent = new Intent(BaseMainActivity.this, SearchResultTabActivity.class);
intent.putExtra("search", query);
startActivity(intent);
@ -670,27 +698,6 @@ public abstract class BaseMainActivity extends BaseActivity
intent.putExtras(b);
startActivity(intent);
}
}else{ //Peertube search
DisplayStatusFragment statusFragment;
Bundle bundle = new Bundle();
statusFragment = new DisplayStatusFragment();
bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE);
bundle.putString("remote_instance", displayPeertube);
bundle.putString("instanceType", "PEERTUBE");
bundle.putString("search_peertube", query);
statusFragment.setArguments(bundle);
String fragmentTag = "REMOTE_INSTANCE";
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.main_app_container, statusFragment, fragmentTag).commit();
if( main_app_container.getVisibility() == View.GONE){
main_app_container.setVisibility(View.VISIBLE);
toolbarTitle.setVisibility(View.VISIBLE);
delete_instance.setVisibility(View.VISIBLE);
viewPager.setVisibility(View.GONE);
tabLayout.setVisibility(View.GONE);
}
}
toolbar_search.setQuery("", false);
toolbar_search.setIconified(true);
@ -1700,8 +1707,6 @@ public abstract class BaseMainActivity extends BaseActivity
ReorderTimelinesActivity.updated = false;
new ManageTimelines().createTabs(BaseMainActivity.this, manageTimelines);
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE);
boolean optimize_loading = sharedpreferences.getBoolean(Helper.SET_OPTIMIZE_LOADING, false);
boolean displayFollowInstance = sharedpreferences.getBoolean(Helper.SET_DISPLAY_FOLLOW_INSTANCE, true);
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
final NavigationView navigationView = findViewById(R.id.nav_view);
@ -1713,13 +1718,23 @@ public abstract class BaseMainActivity extends BaseActivity
position = (timelines.size()-1);
if( position < 0)
position = 0;
setTitle("");
/*if( !optimize_loading)
viewPager.setOffscreenPageLimit(countPage);*/
if( toolbarTitle != null)
toolbarTitle.setVisibility(View.GONE);
viewPager.setOffscreenPageLimit(2);
main_app_container = findViewById(R.id.main_app_container);
adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
boolean iconOnly = true;
for(ManageTimelines tl: timelines){
if( tl.getType() == ManageTimelines.Type.INSTANCE || tl.getType() == ManageTimelines.Type.TAG || tl.getType() == ManageTimelines.Type.LIST){
iconOnly = false;
}
}
if( iconOnly && timelines.size() < 5){
tabLayout.setTabMode(TabLayout.MODE_FIXED);
}else{
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
}
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@ -2136,83 +2151,8 @@ public abstract class BaseMainActivity extends BaseActivity
}
}
private void initializeDownload(){
fetchConfiguration = new FetchConfiguration.Builder(this)
.setDownloadConcurrentLimit(3)
.build();
fetch = Fetch.Impl.getInstance(fetchConfiguration);
FetchListener fetchListener = new FetchListener() {
@Override
public void onWaitingNetwork(@NotNull Download download) {
}
@Override
public void onStarted(@NotNull Download download, @NotNull List<? extends DownloadBlock> list, int i) {
}
@Override
public void onResumed(@NotNull Download download) {
}
@Override
public void onRemoved(@NotNull Download download) {
}
@Override
public void onQueued(@NotNull Download download, boolean b) {
}
@Override
public void onProgress(@NotNull Download download, long l, long l1) {
}
@Override
public void onPaused(@NotNull Download download) {
}
@Override
public void onError(@NotNull Download download, @NotNull Error error, @Nullable Throwable throwable) {
Toasty.error(getApplicationContext(), getString(R.string.toast_error),Toast.LENGTH_LONG).show();
}
@Override
public void onDownloadBlockUpdated(@NotNull Download download, @NotNull DownloadBlock downloadBlock, int i) {
}
@Override
public void onDeleted(@NotNull Download download) {
}
@Override
public void onCompleted(@NotNull Download download) {
if( download.getFileUri().getPath() != null) {
String url = download.getUrl();
final String fileName = URLUtil.guessFileName(url, null, null);
final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
String mime = Helper.getMimeType(url);
File file = new File(download.getFileUri().getPath());
final Intent intent = new Intent();
Random r = new Random();
final int notificationIdTmp = r.nextInt(10000);
intent.setAction(android.content.Intent.ACTION_VIEW);
Uri uri = Uri.parse("file://" + file.getAbsolutePath() );
intent.setDataAndType(uri, mime);
Helper.notify_user(getApplicationContext(), intent, notificationIdTmp, BitmapFactory.decodeResource(getResources(),
R.mipmap.ic_launcher), Helper.NotifType.STORE, getString(R.string.save_over), getString(R.string.download_from, fileName));
}
}
@Override
public void onCancelled(@NotNull Download download) {
}
@Override
public void onAdded(@NotNull Download download) {
}
};
fetch.addListener(fetchListener);
}
public void download(String file, String url){
final Request request = new Request(url, file);
request.setPriority(Priority.HIGH);
request.setNetworkType(NetworkType.ALL);
fetch.enqueue(request, updatedRequest -> {
//Request was successfully enqueued for download.
}, error -> {
});
}
public boolean getFloatingVisibility(){

View File

@ -93,12 +93,13 @@ public class EditProfileActivity extends BaseActivity implements OnRetrieveAccou
private ImageView set_profile_picture, set_header_picture;
private Button set_change_profile_picture, set_change_header_picture, set_profile_save;
private TextView set_header_picture_overlay;
private CheckBox set_lock_account;
private CheckBox set_lock_account, set_sensitive_content;
private static final int PICK_IMAGE_HEADER = 4565;
private static final int PICK_IMAGE_PROFILE = 6545;
private String profile_username, profile_note;
private ByteArrayInputStream profile_picture, header_picture;
private API.accountPrivacy profile_privacy;
private boolean sensitive;
private Bitmap profile_picture_bmp, profile_header_bmp;
private ImageView pp_actionBar;
private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE_HEADER = 754;
@ -173,22 +174,26 @@ public class EditProfileActivity extends BaseActivity implements OnRetrieveAccou
set_profile_save = findViewById(R.id.set_profile_save);
set_header_picture_overlay = findViewById(R.id.set_header_picture_overlay);
set_lock_account = findViewById(R.id.set_lock_account);
set_sensitive_content = findViewById(R.id.set_sensitive_content);
String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(getApplicationContext()));
String instanceVersion = sharedpreferences.getString(Helper.INSTANCE_VERSION + userId + instance, null);
Version currentVersion = new Version(instanceVersion);
Version minVersion = new Version("2.3");
if(currentVersion.compareTo(minVersion) == 1)
if(currentVersion.compareTo(minVersion) == 1) {
set_lock_account.setVisibility(View.VISIBLE);
else
set_sensitive_content.setVisibility(View.VISIBLE);
}else {
set_lock_account.setVisibility(View.GONE);
set_sensitive_content.setVisibility(View.GONE);
}
set_profile_save.setEnabled(false);
set_change_header_picture.setEnabled(false);
set_change_profile_picture.setEnabled(false);
set_profile_name.setEnabled(false);
set_profile_description.setEnabled(false);
set_lock_account.setEnabled(false);
set_sensitive_content.setEnabled(false);
new RetrieveAccountInfoAsyncTask(getApplicationContext(), EditProfileActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@ -231,10 +236,15 @@ public class EditProfileActivity extends BaseActivity implements OnRetrieveAccou
set_profile_name.setEnabled(true);
set_profile_description.setEnabled(true);
set_lock_account.setEnabled(true);
set_sensitive_content.setEnabled(true);
if( account.isLocked())
set_lock_account.setChecked(true);
else
set_lock_account.setChecked(false);
if( account.isSensitive())
set_sensitive_content.setChecked(true);
else
set_sensitive_content.setChecked(false);
set_profile_description.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@ -438,6 +448,7 @@ public class EditProfileActivity extends BaseActivity implements OnRetrieveAccou
}
}
profile_privacy = set_lock_account.isChecked()?API.accountPrivacy.LOCKED:API.accountPrivacy.PUBLIC;
sensitive = set_sensitive_content.isChecked();
dialogBuilder.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
@ -467,7 +478,7 @@ public class EditProfileActivity extends BaseActivity implements OnRetrieveAccou
newCustomFields.put(key3,val3);
newCustomFields.put(key4,val4);
new UpdateCredentialAsyncTask(getApplicationContext(), newCustomFields, profile_username, profile_note, profile_picture, avatarName, header_picture, headerName, profile_privacy, EditProfileActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new UpdateCredentialAsyncTask(getApplicationContext(), newCustomFields, profile_username, profile_note, profile_picture, avatarName, header_picture, headerName, profile_privacy, sensitive, EditProfileActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
});
dialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {

View File

@ -237,8 +237,12 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
final ImageButton account_menu = findViewById(R.id.account_menu);
ImageButton action_more = findViewById(R.id.action_more);
if( theme == THEME_LIGHT)
ImageButton action_back = findViewById(R.id.action_back);
if(theme == THEME_LIGHT){
changeDrawableColor(getApplicationContext(),action_more,R.color.dark_icon);
changeDrawableColor(getApplicationContext(),account_menu,R.color.dark_icon);
changeDrawableColor(getApplicationContext(),action_back,R.color.dark_icon);
}
account_menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -251,6 +255,12 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
showMenu(account_menu);
}
});
action_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
if( account != null){
ManageAccount();
}

View File

@ -1771,6 +1771,9 @@ public class TootActivity extends BaseActivity implements OnPostActionInterface,
toot_picture.setEnabled(true);
toot_it.setEnabled(true);
toot_sensitive.setVisibility(View.VISIBLE);
if( account.isSensitive()){
toot_sensitive.setChecked(true);
}
picture_scrollview.setVisibility(View.VISIBLE);
}else {
if( attachments.size() > index && attachment.getDescription() != null) {

View File

@ -24,6 +24,7 @@ import java.util.List;
import fr.gouv.etalab.mastodon.activities.MainActivity;
import fr.gouv.etalab.mastodon.client.API;
import fr.gouv.etalab.mastodon.client.APIResponse;
import fr.gouv.etalab.mastodon.client.Entities.InstanceNodeInfo;
import fr.gouv.etalab.mastodon.client.Entities.Results;
import fr.gouv.etalab.mastodon.client.GNUAPI;
import fr.gouv.etalab.mastodon.helper.Helper;
@ -74,6 +75,43 @@ public class RetrieveSearchAsyncTask extends AsyncTask<Void, Void, Void> {
if (this.type == null) {
if (MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) {
API api = new API(this.contextReference.get());
String[] split = query.trim().split("@");
if( split.length > 1 ){
String domain;
String username;
if( split.length == 2){
username = split[0];
domain = split[1];
}else{
username = split[1];
domain = split[2];
}
if( domain != null && username != null){
InstanceNodeInfo node = api.getNodeInfo(domain);
String url = null;
if( node != null && node.getName() != null){
switch (node.getName().trim()){
case "MASTODON":
url = "https://" + domain + "/@" + username;
break;
case "PEERTUBE":
url = "https://" + domain + "/accounts/" + username;
break;
case "PIXELFED":
url = "https://" + domain + "/" + username;
break;
case "GNU":
url = "https://" + domain + "/profile/" + username;
break;
}
}
if( url != null)
query = url;
}
}
if (!tagsOnly)
apiResponse = api.search(query);
else {

View File

@ -209,7 +209,8 @@ public class SyncTimelinesAsyncTask extends AsyncTask<Void, Void, Void> {
for(ManageTimelines manageTimeline: manageTimelines){
if( manageTimeline.getRemoteInstance() == null )
continue;
if(manageTimeline.getRemoteInstance().getHost().equals(instance.getHost())){
if(manageTimeline.getRemoteInstance().getHost().trim().equals(instance.getHost().trim())){
isInDb = true;
timelines_tmp = manageTimeline;
break;
@ -222,6 +223,7 @@ public class SyncTimelinesAsyncTask extends AsyncTask<Void, Void, Void> {
manageTL.setType(ManageTimelines.Type.INSTANCE);
manageTL.setPosition(manageTimelines.size());
new TimelinesDAO(contextReference.get(), db).insert(manageTL);
manageTimelines.add(manageTL);
}else{
//Update list
timelines_tmp.setRemoteInstance(instance);
@ -233,7 +235,7 @@ public class SyncTimelinesAsyncTask extends AsyncTask<Void, Void, Void> {
continue;
boolean shouldBeRemoved = true;
for(RemoteInstance instance: instancesInDb){
if( instance.getHost().equals(manageTimelines.getRemoteInstance().getHost())){
if( instance.getHost().trim().equals(manageTimelines.getRemoteInstance().getHost().trim())){
shouldBeRemoved = false;
}
}

View File

@ -97,7 +97,7 @@ public class UpdateAccountInfoAsyncTask extends AsyncTask<Void, Void, Void> {
editor.putString(Helper.PREF_INSTANCE, instance);
editor.apply();
if( userExists)
new AccountDAO(this.contextReference.get(), db).updateAccount(account);
new AccountDAO(this.contextReference.get(), db).updateAccountCredential(account);
else {
if( account.getUsername() != null && account.getCreated_at() != null)
new AccountDAO(this.contextReference.get(), db).insertAccount(account);

View File

@ -60,7 +60,7 @@ public class UpdateAccountInfoByIDAsyncTask extends AsyncTask<Void, Void, Void>
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
Account account = null;
if( social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA)
account = new API(this.contextReference.get()).getAccount(userId);
account = new API(this.contextReference.get()).verifyCredentials();
else if( social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE) {
account = new PeertubeAPI(this.contextReference.get()).verifyCredentials();
account.setSocial("PEERTUBE");
@ -78,7 +78,7 @@ public class UpdateAccountInfoByIDAsyncTask extends AsyncTask<Void, Void, Void>
if( accountDb != null){
account.setInstance(accountDb.getInstance());
account.setToken(accountDb.getToken());
new AccountDAO(this.contextReference.get(), db).updateAccount(account);
new AccountDAO(this.contextReference.get(), db).updateAccountCredential(account);
}
}
if( social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) {

View File

@ -34,6 +34,7 @@ import fr.gouv.etalab.mastodon.interfaces.OnUpdateCredentialInterface;
public class UpdateCredentialAsyncTask extends AsyncTask<Void, Void, Void> {
private String display_name, note, avatarName, headerName;
private boolean senstive;
private ByteArrayInputStream avatar, header;
private API.accountPrivacy privacy;
private APIResponse apiResponse;
@ -41,7 +42,7 @@ public class UpdateCredentialAsyncTask extends AsyncTask<Void, Void, Void> {
private WeakReference<Context> contextReference;
private HashMap<String, String> customFields;
public UpdateCredentialAsyncTask(Context context, HashMap<String, String> customFields, String display_name, String note, ByteArrayInputStream avatar, String avatarName, ByteArrayInputStream header, String headerName, API.accountPrivacy privacy, OnUpdateCredentialInterface onUpdateCredentialInterface){
public UpdateCredentialAsyncTask(Context context, HashMap<String, String> customFields, String display_name, String note, ByteArrayInputStream avatar, String avatarName, ByteArrayInputStream header, String headerName, API.accountPrivacy privacy, boolean senstive, OnUpdateCredentialInterface onUpdateCredentialInterface){
this.contextReference = new WeakReference<>(context);
this.display_name = display_name;
this.note = note;
@ -52,11 +53,12 @@ public class UpdateCredentialAsyncTask extends AsyncTask<Void, Void, Void> {
this.avatarName = avatarName;
this.headerName = headerName;
this.customFields = customFields;
this.senstive = senstive;
}
@Override
protected Void doInBackground(Void... params) {
apiResponse = new API(this.contextReference.get()).updateCredential(display_name, note, avatar, avatarName, header, headerName, privacy, customFields);
apiResponse = new API(this.contextReference.get()).updateCredential(display_name, note, avatar, avatarName, header, headerName, privacy, customFields, senstive);
return null;
}

View File

@ -314,7 +314,7 @@ public class API {
* Update credential of the authenticated user *synchronously*
* @return APIResponse
*/
public APIResponse updateCredential(String display_name, String note, ByteArrayInputStream avatar, String avatarName, ByteArrayInputStream header, String headerName, accountPrivacy privacy, HashMap<String, String> customFields) {
public APIResponse updateCredential(String display_name, String note, ByteArrayInputStream avatar, String avatarName, ByteArrayInputStream header, String headerName, accountPrivacy privacy, HashMap<String, String> customFields, boolean sensitive) {
HashMap<String, String> requestParams = new HashMap<>();
if( display_name != null)
@ -342,6 +342,9 @@ public class API {
i++;
}
}
if(sensitive){
requestParams.put("source[sensitive]", String.valueOf(sensitive));
}
try {
new HttpsConnection(context).patch(getAbsoluteUrl("/accounts/update_credentials"), 60, requestParams, avatar, avatarName, header, headerName, prefKeyOauthTokenT);
} catch (HttpsConnection.HttpsConnectionException e) {
@ -393,7 +396,7 @@ public class API {
}
}if( values.containsKey("refresh_token") && values.get("refresh_token") != null)
targetedAccount.setRefresh_token(values.get("refresh_token"));
new AccountDAO(context, db).updateAccount(targetedAccount);
new AccountDAO(context, db).updateAccountCredential(targetedAccount);
String response;
try {
response = new HttpsConnection(context).get(getAbsoluteUrl("/accounts/verify_credentials"), 60, null, targetedAccount.getToken());
@ -4454,6 +4457,8 @@ public class API {
account.setFieldsVerified(fieldsMapVerified);
}catch (Exception ignored){}
//Retrieves emjis
List<Emojis> emojiList = new ArrayList<>();
try {
@ -4469,6 +4474,17 @@ public class API {
}catch (Exception e){
account.setEmojis(new ArrayList<>());
}
if( resobj.has("source")){
JSONObject source = resobj.getJSONObject("source");
try{
account.setPrivacy(source.getString("privacy"));
account.setSensitive(source.getBoolean("sensitive"));
}catch (Exception e){
account.setPrivacy("public");
account.setSensitive(false);
e.printStackTrace();
}
}
} catch (JSONException ignored) {} catch (ParseException e) {
e.printStackTrace();
}

View File

@ -117,6 +117,8 @@ public class Account implements Parcelable {
private String refresh_token;
private boolean isModerator = false;
private boolean isAdmin = false;
private String privacy = "public";
private boolean sensitive = false;
@ -172,6 +174,8 @@ public class Account implements Parcelable {
dest.writeString(this.refresh_token);
dest.writeByte(this.isModerator ? (byte) 1 : (byte) 0);
dest.writeByte(this.isAdmin ? (byte) 1 : (byte) 0);
dest.writeString(this.privacy);
dest.writeByte(this.sensitive ? (byte) 1 : (byte) 0);
}
public Account() {
@ -225,6 +229,8 @@ public class Account implements Parcelable {
this.refresh_token = in.readString();
this.isModerator = in.readByte() != 0;
this.isAdmin = in.readByte() != 0;
this.privacy = in.readString();
this.sensitive =in.readByte() != 0;
}
public static final Creator<Account> CREATOR = new Creator<Account>() {
@ -384,6 +390,22 @@ public class Account implements Parcelable {
this.updated_at = updated_at;
}
public String getPrivacy() {
return privacy;
}
public void setPrivacy(String privacy) {
this.privacy = privacy;
}
public boolean isSensitive() {
return sensitive;
}
public void setSensitive(boolean sensitive) {
this.sensitive = sensitive;
}
public enum followAction{
FOLLOW,

View File

@ -134,6 +134,8 @@ public class Status implements Parcelable{
private boolean isNotice = false;
private Poll poll = null;
private int media_height;
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.id);
@ -190,6 +192,7 @@ public class Status implements Parcelable{
dest.writeByte(this.showSpoiler ? (byte) 1 : (byte) 0);
dest.writeByte(this.isNotice ? (byte) 1 : (byte) 0);
dest.writeParcelable(this.poll, flags);
dest.writeInt(this.media_height);
}
protected Status(Parcel in) {
@ -249,6 +252,7 @@ public class Status implements Parcelable{
this.showSpoiler = in.readByte() != 0;
this.isNotice = in.readByte() != 0;
this.poll = in.readParcelable(Poll.class.getClassLoader());
this.media_height = in.readInt();
}
public static final Creator<Status> CREATOR = new Creator<Status>() {
@ -1340,4 +1344,12 @@ public class Status implements Parcelable{
public void setPoll(Poll poll) {
this.poll = poll;
}
public int getMedia_height() {
return media_height;
}
public void setMedia_height(int media_height) {
this.media_height = media_height;
}
}

View File

@ -64,7 +64,7 @@ public class AccountsFollowRequestAdapter extends RecyclerView.Adapter implement
this.context = context;
accountsFollowRequestAdapter = this;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@ -78,7 +78,8 @@ public class AccountsFollowRequestAdapter extends RecyclerView.Adapter implement
final Account account = accounts.get(position);
holder.btn_authorize.getBackground().setColorFilter(ContextCompat.getColor(context, R.color.green_1), PorterDuff.Mode.MULTIPLY);
holder.btn_reject.getBackground().setColorFilter(ContextCompat.getColor(context, R.color.red_1), PorterDuff.Mode.MULTIPLY);
holder.account_un.setText(String.format("@%s", account.getUsername()));
holder.account_dn.setText(Helper.shortnameToUnicode(account.getDisplay_name(),true));
holder.account_un.setText(account.getAcct());
//Profile picture
Glide.with(holder.account_pp.getContext())
.load(account.getAvatar())
@ -89,6 +90,12 @@ public class AccountsFollowRequestAdapter extends RecyclerView.Adapter implement
openAccountDetails(account);
}
});
holder.account_dn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openAccountDetails(account);
}
});
holder.account_un.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -157,11 +164,13 @@ public class AccountsFollowRequestAdapter extends RecyclerView.Adapter implement
ImageView account_pp;
Button btn_authorize;
Button btn_reject;
TextView account_dn;
TextView account_un;
public ViewHolder(View itemView) {
super(itemView);
account_pp = itemView.findViewById(R.id.account_pp);
account_dn = itemView.findViewById(R.id.account_dn);
account_un = itemView.findViewById(R.id.account_un);
btn_authorize = itemView.findViewById(R.id.btn_authorize);
btn_reject = itemView.findViewById(R.id.btn_reject);

View File

@ -147,6 +147,7 @@ import fr.gouv.etalab.mastodon.sqlite.StatusCacheDAO;
import fr.gouv.etalab.mastodon.sqlite.StatusStoredDAO;
import fr.gouv.etalab.mastodon.sqlite.TempMuteDAO;
import fr.gouv.etalab.mastodon.sqlite.TimelinesDAO;
import jp.wasabeef.glide.transformations.BlurTransformation;
import static fr.gouv.etalab.mastodon.activities.BaseMainActivity.mPageReferenceMap;
import static fr.gouv.etalab.mastodon.activities.BaseMainActivity.social;
@ -183,6 +184,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
private Status toot;
private TagTimeline tagTimeline;
public static boolean fetch_all_more = false;
public StatusListAdapter(Context context, RetrieveFeedsAsyncTask.Type type, String targetedId, boolean isOnWifi, List<Status> statuses){
super();
this.context = context;
@ -300,7 +302,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
TextView status_favorite_count;
TextView status_reblog_count;
TextView status_toot_date;
Button status_show_more;
RelativeLayout status_show_more;
ImageView status_more;
LinearLayout status_document_container;
RelativeLayout status_horizontal_document_container;
@ -356,7 +358,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
RelativeLayout horizontal_second_image;
LinearLayout status_peertube_container;
TextView status_peertube_reply, status_peertube_delete;
TextView status_peertube_reply, status_peertube_delete, show_more_content;
//Poll
@ -421,6 +423,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
status_spoiler_container = itemView.findViewById(R.id.status_spoiler_container);
status_content_container = itemView.findViewById(R.id.status_content_container);
status_spoiler = itemView.findViewById(R.id.status_spoiler);
show_more_content = itemView.findViewById(R.id.show_more_content);
status_spoiler_button = itemView.findViewById(R.id.status_spoiler_button);
yandex_translate = itemView.findViewById(R.id.yandex_translate);
new_element = itemView.findViewById(R.id.new_element);
@ -536,7 +539,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
boolean display_card = sharedpreferences.getBoolean(Helper.SET_DISPLAY_CARD, false);
boolean display_video_preview = sharedpreferences.getBoolean(Helper.SET_DISPLAY_VIDEO_PREVIEWS, true);
int truncate_toots_size = sharedpreferences.getInt(Helper.SET_TRUNCATE_TOOTS_SIZE, 0);
final int timeout = sharedpreferences.getInt(Helper.SET_NSFW_TIMEOUT, 5);
boolean share_details = sharedpreferences.getBoolean(Helper.SET_SHARE_DETAILS, true);
boolean confirmFav = sharedpreferences.getBoolean(Helper.SET_NOTIF_VALIDATION_FAV, false);
boolean confirmBoost = sharedpreferences.getBoolean(Helper.SET_NOTIF_VALIDATION, true);
@ -1535,6 +1538,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
}
}
if (status.getReblog() == null) {
if (status.getMedia_attachments().size() < 1) {
holder.status_horizontal_document_container.setVisibility(View.GONE);
@ -1544,27 +1548,30 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
//If medias are loaded without any conditions or if device is on wifi
if(behaviorWithAttachments != Helper.ATTACHMENT_ASK ) {
if (expand_media || !status.isSensitive() && (behaviorWithAttachments == Helper.ATTACHMENT_ALWAYS || (behaviorWithAttachments == Helper.ATTACHMENT_WIFI && isOnWifi))) {
loadAttachments(status, holder);
loadAttachments(status, holder, false);
holder.status_show_more.setVisibility(View.GONE);
status.setAttachmentShown(true);
} else {
//Text depending if toots is sensitive or not
String textShowMore = (status.isSensitive()) ? context.getString(R.string.load_sensitive_attachment) : context.getString(R.string.load_attachment);
holder.status_show_more.setText(textShowMore);
String textShowMore = (status.isSensitive()) ? context.getString(R.string.load_sensitive_attachment) : context.getString(R.string.set_attachment_action);
holder.show_more_content.setText(textShowMore);
if (!status.isAttachmentShown()) {
holder.status_show_more.setVisibility(View.VISIBLE);
if (fullAttachement)
holder.status_horizontal_document_container.setVisibility(View.GONE);
else
holder.status_document_container.setVisibility(View.GONE);
if(behaviorWithAttachments == Helper.ATTACHMENT_ALWAYS || (behaviorWithAttachments == Helper.ATTACHMENT_WIFI && isOnWifi)){
loadAttachments(status, holder, true);
}
} else {
loadAttachments(status, holder);
loadAttachments(status, holder, false);
}
}
}else {
//Text depending if toots is sensitive or not
String textShowMore = (status.isSensitive()) ? context.getString(R.string.load_sensitive_attachment) : context.getString(R.string.load_attachment);
holder.status_show_more.setText(textShowMore);
String textShowMore = (status.isSensitive()) ? context.getString(R.string.load_sensitive_attachment) : context.getString(R.string.set_attachment_action);
holder.show_more_content.setText(textShowMore);
if (!status.isAttachmentShown()) {
holder.status_show_more.setVisibility(View.VISIBLE);
if (fullAttachement)
@ -1572,7 +1579,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
else
holder.status_document_container.setVisibility(View.GONE);
} else {
loadAttachments(status, holder);
loadAttachments(status, holder, false);
}
}
}
@ -1588,27 +1595,30 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
if(behaviorWithAttachments != Helper.ATTACHMENT_ASK ) {
//If medias are loaded without any conditions or if device is on wifi
if (expand_media || !status.getReblog().isSensitive() && (behaviorWithAttachments == Helper.ATTACHMENT_ALWAYS || (behaviorWithAttachments == Helper.ATTACHMENT_WIFI && isOnWifi))) {
loadAttachments(status.getReblog(), holder);
loadAttachments(status.getReblog(), holder, false);
holder.status_show_more.setVisibility(View.GONE);
status.setAttachmentShown(true);
} else {
//Text depending if toots is sensitive or not
String textShowMore = (status.getReblog().isSensitive()) ? context.getString(R.string.load_sensitive_attachment) : context.getString(R.string.load_attachment);
holder.status_show_more.setText(textShowMore);
String textShowMore = (status.getReblog().isSensitive()) ? context.getString(R.string.load_sensitive_attachment) : context.getString(R.string.set_attachment_action);
holder.show_more_content.setText(textShowMore);
if (!status.isAttachmentShown()) {
holder.status_show_more.setVisibility(View.VISIBLE);
if (fullAttachement)
holder.status_horizontal_document_container.setVisibility(View.GONE);
else
holder.status_document_container.setVisibility(View.GONE);
if(behaviorWithAttachments == Helper.ATTACHMENT_ALWAYS || (behaviorWithAttachments == Helper.ATTACHMENT_WIFI && isOnWifi)){
loadAttachments(status, holder, true);
}
} else {
loadAttachments(status.getReblog(), holder);
loadAttachments(status.getReblog(), holder, false);
}
}
}else{
//Text depending if toots is sensitive or not
String textShowMore = (status.getReblog().isSensitive()) ? context.getString(R.string.load_sensitive_attachment) : context.getString(R.string.load_attachment);
holder.status_show_more.setText(textShowMore);
String textShowMore = (status.getReblog().isSensitive()) ? context.getString(R.string.load_sensitive_attachment) : context.getString(R.string.set_attachment_action);
holder.show_more_content.setText(textShowMore);
if (!status.isAttachmentShown()) {
holder.status_show_more.setVisibility(View.VISIBLE);
if (fullAttachement)
@ -1616,11 +1626,37 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
else
holder.status_document_container.setVisibility(View.GONE);
} else {
loadAttachments(status.getReblog(), holder);
loadAttachments(status.getReblog(), holder, false);
}
}
}
}
holder.status_show_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
status.setAttachmentShown(true);
notifyStatusChanged(status);
/*
Added a Countdown Timer, so that Sensitive (NSFW)
images only get displayed for user set time,
giving the user time to click on them to expand them,
if they want. Images are then hidden again.
-> Default value is set to 5 seconds
*/
final int timeout = sharedpreferences.getInt(Helper.SET_NSFW_TIMEOUT, 5);
if (timeout > 0) {
new CountDownTimer((timeout * 1000), 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
status.setAttachmentShown(false);
notifyStatusChanged(status);
}
}.start();
}
}
});
if (theme == Helper.THEME_BLACK) {
changeDrawableColor(context, R.drawable.ic_photo, R.color.dark_text);
changeDrawableColor(context, R.drawable.ic_more_toot_content, R.color.dark_text);
@ -2068,32 +2104,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
}
});
holder.status_show_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
status.setAttachmentShown(true);
notifyStatusChanged(status);
/*
Added a Countdown Timer, so that Sensitive (NSFW)
images only get displayed for user set time,
giving the user time to click on them to expand them,
if they want. Images are then hidden again.
-> Default value is set to 5 seconds
*/
if (timeout > 0) {
new CountDownTimer((timeout * 1000), 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
status.setAttachmentShown(false);
notifyStatusChanged(status);
}
}.start();
}
}
});
if (type == RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE)
holder.status_more.setVisibility(View.GONE);
@ -2716,17 +2726,20 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
}else{
holder.status_toot_app.setVisibility(View.GONE);
}
}
}
private void loadAttachments(final Status status, final ViewHolder holder){
private void loadAttachments(final Status status, final ViewHolder holder, boolean blur){
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
boolean fullAttachement = sharedpreferences.getBoolean(Helper.SET_FULL_PREVIEW, false);
List<Attachment> attachments = status.getMedia_attachments();
if( !blur)
holder.status_show_more.setVisibility(View.GONE);
else
holder.status_show_more.setVisibility(View.VISIBLE);
if( attachments != null && attachments.size() > 0){
int i = 0;
holder.horizontal_second_image.setVisibility(View.VISIBLE);
@ -2798,6 +2811,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
int position = 1;
for(final Attachment attachment: attachments){
ImageView imageView;
RelativeLayout container = holder.status_horizontal_document_container;
if( i == 0) {
imageView = fullAttachement?holder.status_prev1_h:holder.status_prev1;
if( attachment.getType().toLowerCase().equals("image") || attachment.getType().toLowerCase().equals("unknown"))
@ -2896,36 +2910,72 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
if( fullAttachement){
imageView.setImageBitmap(null);
if( !url.trim().contains("missing.png") && !((Activity)context).isFinishing() )
Glide.with(imageView.getContext())
.asBitmap()
.load(url)
.thumbnail(0.1f)
.apply(new RequestOptions().transforms(new CenterCrop(), new RoundedCorners(10)))
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
DrawableTransitionOptions.withCrossFade();
int width = resource.getWidth();
int height = resource.getHeight();
if( !url.trim().contains("missing.png") && !((Activity)context).isFinishing() ) {
if( !blur) {
Glide.with(imageView.getContext())
.asBitmap()
.load(url)
.thumbnail(0.1f)
.apply(new RequestOptions().transforms(new CenterCrop(), new RoundedCorners(10)))
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
DrawableTransitionOptions.withCrossFade();
int width = resource.getWidth();
int height = resource.getHeight();
if( height < Helper.convertDpToPixel(200, context)){
double ratio = ((double)Helper.convertDpToPixel(200, context) / (double)height);
width = (int)(ratio * width);
height = (int) Helper.convertDpToPixel(200, context);
resource = Bitmap.createScaledBitmap(resource, width, height, false);
if (height < Helper.convertDpToPixel(200, context)) {
double ratio = ((double) Helper.convertDpToPixel(200, context) / (double) height);
width = (int) (ratio * width);
height = (int) Helper.convertDpToPixel(200, context);
resource = Bitmap.createScaledBitmap(resource, width, height, false);
}
imageView.setImageBitmap(resource);
status.setMedia_height(container.getHeight());
}
imageView.setImageBitmap(resource);
}
});
});
}else{
Glide.with(imageView.getContext())
.asBitmap()
.load(url)
.thumbnail(0.1f)
.apply(new RequestOptions().transforms(new BlurTransformation(50,3), new RoundedCorners(10)))
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
DrawableTransitionOptions.withCrossFade();
int width = resource.getWidth();
int height = resource.getHeight();
if (height < Helper.convertDpToPixel(200, context)) {
double ratio = ((double) Helper.convertDpToPixel(200, context) / (double) height);
width = (int) (ratio * width);
height = (int) Helper.convertDpToPixel(200, context);
resource = Bitmap.createScaledBitmap(resource, width, height, false);
}
imageView.setImageBitmap(resource);
}
});
}
}
}else {
if (!url.trim().contains("missing.png") && !((Activity) context).isFinishing())
Glide.with(imageView.getContext())
.load(url)
.thumbnail(0.1f)
.apply(new RequestOptions().transforms(new CenterCrop(), new RoundedCorners(10)))
.transition(DrawableTransitionOptions.withCrossFade())
.into(imageView);
if (!url.trim().contains("missing.png") && !((Activity) context).isFinishing()) {
if( !blur) {
Glide.with(imageView.getContext())
.load(url)
.thumbnail(0.1f)
.apply(new RequestOptions().transforms(new CenterCrop(), new RoundedCorners(10)))
.transition(DrawableTransitionOptions.withCrossFade())
.into(imageView);
}else{
Glide.with(imageView.getContext())
.load(url)
.thumbnail(0.1f)
.apply(new RequestOptions().transforms(new BlurTransformation(50,3), new RoundedCorners(10)))
.transition(DrawableTransitionOptions.withCrossFade())
.into(imageView);
}
}
}
final int finalPosition = position;
if( attachment.getDescription() != null && !attachment.getDescription().equals("null"))
@ -2933,15 +2983,40 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if( attachment.getType().equals("web")){
Helper.openBrowser(context, attachment.getUrl());
}else {
Intent intent = new Intent(context, MediaActivity.class);
Bundle b = new Bundle();
intent.putParcelableArrayListExtra("mediaArray", status.getMedia_attachments());
b.putInt("position", finalPosition);
intent.putExtras(b);
context.startActivity(intent);
if( status.isAttachmentShown()) {
if (attachment.getType().equals("web")) {
Helper.openBrowser(context, attachment.getUrl());
} else {
Intent intent = new Intent(context, MediaActivity.class);
Bundle b = new Bundle();
intent.putParcelableArrayListExtra("mediaArray", status.getMedia_attachments());
b.putInt("position", finalPosition);
intent.putExtras(b);
context.startActivity(intent);
}
}else{
status.setAttachmentShown(true);
notifyStatusChanged(status);
/*
Added a Countdown Timer, so that Sensitive (NSFW)
images only get displayed for user set time,
giving the user time to click on them to expand them,
if they want. Images are then hidden again.
-> Default value is set to 5 seconds
*/
final int timeout = sharedpreferences.getInt(Helper.SET_NSFW_TIMEOUT, 5);
if (timeout > 0) {
new CountDownTimer((timeout * 1000), 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
status.setAttachmentShown(false);
notifyStatusChanged(status);
}
}.start();
}
}
}
});
@ -2950,7 +3025,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
public boolean onLongClick(View v) {
String myDir = sharedpreferences.getString(Helper.SET_FOLDER_RECORD, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath());
String fileName = URLUtil.guessFileName(attachment.getUrl(), null, null);
((MainActivity)context).download(myDir+"/"+fileName, attachment.getUrl());
Helper.download(context,myDir+"/"+fileName, attachment.getUrl());
return true;
}
});
@ -2958,11 +3033,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
position++;
}
}else{
holder.status_horizontal_document_container.setVisibility(View.GONE);
holder.status_document_container.setVisibility(View.GONE);
holder.status_horizontal_document_container.setVisibility(View.GONE);
holder.status_document_container.setVisibility(View.GONE);
holder.status_show_more.setVisibility(View.GONE);
}
holder.status_show_more.setVisibility(View.GONE);
}

View File

@ -163,7 +163,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn
timelineId = bundle.getInt("timelineId");
}
if( ischannel)
type = RetrieveFeedsAsyncTask.Type.CHANNEL;

View File

@ -118,8 +118,18 @@ import com.jaredrummler.materialspinner.MaterialSpinner;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu;
import com.oguzdev.circularfloatingactionmenu.library.SubActionButton;
import com.tonyodev.fetch2.Download;
import com.tonyodev.fetch2.Error;
import com.tonyodev.fetch2.Fetch;
import com.tonyodev.fetch2.FetchConfiguration;
import com.tonyodev.fetch2.FetchListener;
import com.tonyodev.fetch2.NetworkType;
import com.tonyodev.fetch2.Priority;
import com.tonyodev.fetch2.Request;
import com.tonyodev.fetch2core.DownloadBlock;
import org.conscrypt.Conscrypt;
import org.jetbrains.annotations.NotNull;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
@ -3859,5 +3869,82 @@ public class Helper {
}
public static void download(Context context, String file, String url){
FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(context)
.setDownloadConcurrentLimit(3)
.build();
Fetch fetch = Fetch.Impl.getInstance(fetchConfiguration);
FetchListener fetchListener = new FetchListener() {
@Override
public void onWaitingNetwork(@NotNull Download download) {
}
@Override
public void onStarted(@NotNull Download download, @NotNull List<? extends DownloadBlock> list, int i) {
}
@Override
public void onResumed(@NotNull Download download) {
}
@Override
public void onRemoved(@NotNull Download download) {
}
@Override
public void onQueued(@NotNull Download download, boolean b) {
}
@Override
public void onProgress(@NotNull Download download, long l, long l1) {
}
@Override
public void onPaused(@NotNull Download download) {
}
@Override
public void onError(@NotNull Download download, @NotNull Error error, @org.jetbrains.annotations.Nullable Throwable throwable) {
Toasty.error(context, context.getString(R.string.toast_error),Toast.LENGTH_LONG).show();
}
@Override
public void onDownloadBlockUpdated(@NotNull Download download, @NotNull DownloadBlock downloadBlock, int i) {
}
@Override
public void onDeleted(@NotNull Download download) {
}
@Override
public void onCompleted(@NotNull Download download) {
if( download.getFileUri().getPath() != null) {
String url = download.getUrl();
final String fileName = URLUtil.guessFileName(url, null, null);
final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
String mime = Helper.getMimeType(url);
File file = new File(download.getFileUri().getPath());
final Intent intent = new Intent();
Random r = new Random();
final int notificationIdTmp = r.nextInt(10000);
intent.setAction(android.content.Intent.ACTION_VIEW);
Uri uri = Uri.parse("file://" + file.getAbsolutePath() );
intent.setDataAndType(uri, mime);
Helper.notify_user(context, intent, notificationIdTmp, BitmapFactory.decodeResource(context.getResources(),
R.mipmap.ic_launcher), Helper.NotifType.STORE, context.getString(R.string.save_over), context.getString(R.string.download_from, fileName));
}
}
@Override
public void onCancelled(@NotNull Download download) {
}
@Override
public void onAdded(@NotNull Download download) {
}
};
fetch.addListener(fetchListener);
final Request request = new Request(url, file);
request.setPriority(Priority.HIGH);
request.setNetworkType(NetworkType.ALL);
fetch.enqueue(request, updatedRequest -> {
//Request was successfully enqueued for download.
}, error -> {
});
}
}

View File

@ -82,6 +82,8 @@ public class AccountDAO {
if( account.getToken() != null)
values.put(Sqlite.COL_OAUTHTOKEN, account.getToken());
values.put(Sqlite.COL_SENSITIVE, account.isSensitive());
values.put(Sqlite.COL_PRIVACY, account.getPrivacy());
//Inserts account
try{
db.insert(Sqlite.TABLE_USER_ACCOUNT, null, values);
@ -128,7 +130,49 @@ public class AccountDAO {
}
if( account.getToken() != null)
values.put(Sqlite.COL_OAUTHTOKEN, account.getToken());
return db.update(Sqlite.TABLE_USER_ACCOUNT,
values, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_USERNAME + " =?",
new String[]{account.getId(), account.getUsername()});
}
/**
* Update an Account in database
* @param account Account
* @return boolean
*/
public int updateAccountCredential(Account account)
{
ContentValues values = new ContentValues();
if( account.getNote() == null)
account.setNote("");
if( account.getCreated_at() == null)
account.setCreated_at(new Date());
values.put(Sqlite.COL_ACCT, account.getAcct());
values.put(Sqlite.COL_DISPLAYED_NAME, account.getDisplay_name());
values.put(Sqlite.COL_LOCKED,account.isLocked());
values.put(Sqlite.COL_FOLLOWERS_COUNT,account.getFollowers_count());
values.put(Sqlite.COL_FOLLOWING_COUNT,account.getFollowing_count());
values.put(Sqlite.COL_STATUSES_COUNT,account.getStatuses_count());
values.put(Sqlite.COL_NOTE,account.getNote());
values.put(Sqlite.COL_URL,account.getUrl());
values.put(Sqlite.COL_AVATAR,account.getAvatar());
values.put(Sqlite.COL_AVATAR_STATIC,account.getAvatar_static());
values.put(Sqlite.COL_HEADER,account.getHeader());
values.put(Sqlite.COL_HEADER_STATIC,account.getHeader_static());
values.put(Sqlite.COL_CREATED_AT, Helper.dateToString(account.getCreated_at()));
values.put(Sqlite.COL_INSTANCE, account.getInstance());
values.put(Sqlite.COL_EMOJIS, Helper.emojisToStringStorage(account.getEmojis()));
values.put(Sqlite.COL_SOCIAL, account.getSocial());
if( account.getClient_id() != null && account.getClient_secret() != null && account.getRefresh_token() != null) {
values.put(Sqlite.COL_CLIENT_ID, account.getClient_id());
values.put(Sqlite.COL_CLIENT_SECRET, account.getClient_secret());
values.put(Sqlite.COL_REFRESH_TOKEN, account.getRefresh_token());
}
if( account.getToken() != null)
values.put(Sqlite.COL_OAUTHTOKEN, account.getToken());
values.put(Sqlite.COL_SENSITIVE, account.isSensitive());
values.put(Sqlite.COL_PRIVACY, account.getPrivacy());
return db.update(Sqlite.TABLE_USER_ACCOUNT,
values, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_USERNAME + " =?",
new String[]{account.getId(), account.getUsername()});
@ -325,6 +369,8 @@ public class AccountDAO {
account.setClient_id(c.getString(c.getColumnIndex(Sqlite.COL_CLIENT_ID)));
account.setClient_secret(c.getString(c.getColumnIndex(Sqlite.COL_CLIENT_SECRET)));
account.setRefresh_token(c.getString(c.getColumnIndex(Sqlite.COL_REFRESH_TOKEN)));
account.setSensitive(c.getInt(c.getColumnIndex(Sqlite.COL_SENSITIVE)) == 1);
account.setPrivacy((c.getString(c.getColumnIndex(Sqlite.COL_PRIVACY))));
//Close the cursor
c.close();
@ -368,6 +414,8 @@ public class AccountDAO {
account.setClient_id(c.getString(c.getColumnIndex(Sqlite.COL_CLIENT_ID)));
account.setClient_secret(c.getString(c.getColumnIndex(Sqlite.COL_CLIENT_SECRET)));
account.setRefresh_token(c.getString(c.getColumnIndex(Sqlite.COL_REFRESH_TOKEN)));
account.setSensitive(c.getInt(c.getColumnIndex(Sqlite.COL_SENSITIVE)) == 1);
account.setPrivacy((c.getString(c.getColumnIndex(Sqlite.COL_PRIVACY))));
accounts.add(account);
}
//Close the cursor

View File

@ -46,7 +46,7 @@ import fr.gouv.etalab.mastodon.helper.Helper;
public class Sqlite extends SQLiteOpenHelper {
public static final int DB_VERSION = 28;
public static final int DB_VERSION = 29;
public static final String DB_NAME = "mastodon_etalab_db";
public static SQLiteDatabase db;
private static Sqlite sInstance;
@ -115,6 +115,8 @@ public class Sqlite extends SQLiteOpenHelper {
static final String COL_IS_MODERATOR = "IS_MODERATOR";
static final String COL_IS_ADMIN = "IS_ADMIN";
static final String COL_UPDATED_AT = "UPDATED_AT";
static final String COL_PRIVACY = "PRIVACY";
static final String COL_SENSITIVE = "SENSITIVE";
private static final String CREATE_TABLE_USER_ACCOUNT = "CREATE TABLE " + TABLE_USER_ACCOUNT + " ("
+ COL_USER_ID + " TEXT PRIMARY KEY, " + COL_USERNAME + " TEXT NOT NULL, " + COL_ACCT + " TEXT NOT NULL, "
@ -129,6 +131,8 @@ public class Sqlite extends SQLiteOpenHelper {
+ COL_IS_ADMIN + " INTEGER DEFAULT 0, "
+ COL_CLIENT_ID + " TEXT, " + COL_CLIENT_SECRET + " TEXT, " + COL_REFRESH_TOKEN + " TEXT,"
+ COL_UPDATED_AT + " TEXT, "
+ COL_PRIVACY + " TEXT, "
+ COL_SENSITIVE + " INTEGER DEFAULT 0, "
+ COL_INSTANCE + " TEXT NOT NULL, " + COL_OAUTHTOKEN + " TEXT NOT NULL, " + COL_CREATED_AT + " TEXT NOT NULL)";
@ -191,7 +195,7 @@ public class Sqlite extends SQLiteOpenHelper {
static final String COL_REBLOGGED = "REBLOGGED";
static final String COL_FAVOURITED = "FAVOURITED";
static final String COL_MUTED = "MUTED";
static final String COL_SENSITIVE = "SENSITIVE";
static final String COL_SPOILER_TEXT = "SPOILER_TEXT";
static final String COL_VISIBILITY = "VISIBILITY";
static final String COL_MEDIA_ATTACHMENTS = "MEDIA_ATTACHMENTS";
@ -389,6 +393,9 @@ public class Sqlite extends SQLiteOpenHelper {
db.execSQL(CREATE_TABLE_TRACKING_BLOCK);
case 27:
db.execSQL(CREATE_TABLE_TIMELINES);
case 28:
db.execSQL("ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_PRIVACY + " TEXT");
db.execSQL("ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_SENSITIVE + " INTEGER DEFAULT 0");
default:
break;
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"/>
</vector>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<stroke
android:width="1dp"
android:color="#77000000" />
<solid android:color="#77000000" />
<padding
android:left="1dp"
android:right="1dp"
android:bottom="1dp"
android:top="1dp" />
<corners android:radius="5dp" />
</shape>

View File

@ -91,6 +91,20 @@
android:layout_width="40dp"
android:layout_height="40dp" />
<ImageButton
android:id="@+id/action_back"
android:background="?attr/selectableItemBackgroundBorderless"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:src="@drawable/ic_back"
android:layout_marginRight="10dp"
android:layout_marginEnd="10dp"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:contentDescription="@string/go_back" />
<ImageButton
android:id="@+id/account_menu"
android:background="?attr/selectableItemBackgroundBorderless"

View File

@ -207,6 +207,13 @@
android:text="@string/set_lock_account"
android:layout_height="wrap_content" />
<!-- Sensitive content -->
<CheckBox
android:layout_marginTop="10dp"
android:id="@+id/set_sensitive_content"
android:layout_width="wrap_content"
android:text="@string/set_sensitive_content"
android:layout_height="wrap_content" />
<Button
android:layout_marginTop="5dp"

View File

@ -90,6 +90,20 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageButton
android:id="@+id/action_back"
android:background="?attr/selectableItemBackgroundBorderless"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:src="@drawable/ic_back"
android:layout_marginRight="10dp"
android:layout_marginEnd="10dp"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:contentDescription="@string/go_back" />
<ImageButton
android:id="@+id/account_menu"
android:background="?attr/selectableItemBackgroundBorderless"
@ -436,7 +450,7 @@
android:text="@string/disclaimer_full"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/account_tabLayout"
android:layout_width="match_parent"

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
Copyright 2017 Thomas Schneider
This file is a part of Mastalab
@ -15,54 +14,75 @@
You should have received a copy of the GNU General Public License along with Mastalab; if not,
see <http://www.gnu.org/licenses>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/account_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/account_container"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:orientation="horizontal">
android:layout_marginBottom="5dp">
<ImageView
android:layout_gravity="center"
android:id="@+id/account_pp"
android:layout_width="60dp"
android:layout_height="60dp"
android:contentDescription="@string/profile_picture"/>
android:layout_gravity="center"
android:contentDescription="@string/profile_picture"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/account_dn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:maxLines="1"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@id/account_un"
app:layout_constraintLeft_toRightOf="@id/account_pp"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/account_un"
android:padding="5dp"
android:maxLines="1"
android:gravity="center"
android:textSize="16sp"
android:layout_gravity="center"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="wrap_content"
android:gravity="end"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/btn_authorize"
android:text="@string/authorize"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:layout_gravity="end"
android:gravity="center"
style="@style/Base.Widget.AppCompat.Button.Small"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_reject"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:text="@string/reject"
android:layout_gravity="end"
android:gravity="center"
style="@style/Base.Widget.AppCompat.Button.Small"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:maxLines="1"
android:textSize="15sp"
app:layout_constraintBottom_toTopOf="@id/btn_top_barrier"
app:layout_constraintLeft_toRightOf="@id/account_pp"
app:layout_constraintTop_toBottomOf="@id/account_dn" />
</LinearLayout>
<android.support.constraint.Barrier
android:id="@+id/btn_top_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="top"
app:constraint_referenced_ids="btn_authorize,btn_reject" />
<Button
android:id="@+id/btn_authorize"
style="@style/Base.Widget.AppCompat.Button.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:text="@string/authorize"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/btn_reject" />
<Button
android:id="@+id/btn_reject"
style="@style/Base.Widget.AppCompat.Button.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:text="@string/reject"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>

View File

@ -416,268 +416,279 @@
<RelativeLayout
android:id="@+id/status_horizontal_document_container"
android:visibility="gone"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/horizontal_second_image"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev2_h"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev2_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_marginTop="1dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev3_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev4_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/hide_preview_h"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/show_media"/>
</RelativeLayout>
<LinearLayout
android:visibility="gone"
android:id="@+id/status_document_container"
android:orientation="horizontal"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="200dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:contentDescription="@string/show_media"
android:id="@+id/status_prev1"
android:id="@+id/status_horizontal_document_container"
android:visibility="gone"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/horizontal_second_image"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev2_h"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev2_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_marginTop="1dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev3_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev4_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/status_prev1_play"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp" />
<ImageView
android:id="@+id/hide_preview"
android:id="@+id/hide_preview_h"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media"/>
android:contentDescription="@string/show_media"/>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:id="@+id/status_container2"
android:layout_weight="1"
android:layout_height="match_parent">
android:visibility="gone"
android:id="@+id/status_document_container"
android:orientation="horizontal"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="200dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="0dp"
android:layout_weight="1">
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev2"
android:contentDescription="@string/show_media"
android:id="@+id/status_prev1"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play"
android:visibility="gone"
android:id="@+id/status_prev2_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
android:layout_height="30dp" />
<ImageView
android:id="@+id/hide_preview"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media"/>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:id="@+id/status_container2"
android:layout_weight="1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="2dp"
android:id="@+id/status_container3"
android:layout_height="0dp"
android:baselineAligned="false">
android:layout_height="match_parent">
<RelativeLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:id="@+id/status_prev3"
android:id="@+id/status_prev2"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play"
android:visibility="gone"
android:id="@+id/status_prev2_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:visibility="gone"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:layout_weight="1"
android:layout_width="0dp"
android:id="@+id/status_prev4_container"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev4"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
android:visibility="gone"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="2dp"
android:id="@+id/status_container3"
android:layout_height="0dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev3"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:visibility="gone"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:layout_weight="1"
android:layout_width="0dp"
android:id="@+id/status_prev4_container"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev4"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
android:visibility="gone"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/status_show_more"
android:visibility="gone"
android:textAllCaps="false"
android:drawableLeft="@drawable/ic_photo"
android:drawableStart="@drawable/ic_photo"
android:gravity="center_vertical"
android:drawablePadding="5dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?attr/borderless"
android:text="@string/load_attachment" />
<RelativeLayout
android:visibility="gone"
android:id="@+id/status_show_more"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
>
<TextView
android:textSize="20sp"
android:gravity="center"
android:id="@+id/show_more_content"
android:layout_gravity="center"
android:layout_centerInParent="true"
android:padding="12dp"
android:background="@drawable/rounded_label_sensitive"
android:textColor="#ffffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout

View File

@ -372,277 +372,283 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
<RelativeLayout
android:id="@+id/status_horizontal_document_container"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/horizontal_second_image"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev2_h"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev2_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="1dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev3_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev4_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/hide_preview_h"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media"/>
</RelativeLayout>
<LinearLayout
android:visibility="gone"
android:id="@+id/status_document_container"
android:orientation="horizontal"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginBottom="5dp"
android:baselineAligned="false">
android:layout_height="wrap_content"
>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1"
android:id="@+id/status_horizontal_document_container"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/horizontal_second_image"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev2_h"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev2_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="1dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev3_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev4_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/status_prev1_play"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
<ImageView
android:id="@+id/hide_preview"
android:id="@+id/hide_preview_h"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media" />
android:contentDescription="@string/hide_media"/>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:id="@+id/status_container2"
android:layout_weight="1"
android:layout_height="match_parent">
android:visibility="gone"
android:id="@+id/status_document_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginBottom="5dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="0dp"
android:layout_weight="1">
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev2"
android:id="@+id/status_prev1"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
/>
<ImageView
android:id="@+id/status_prev1_play"
android:visibility="gone"
android:id="@+id/status_prev2_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
android:contentDescription="@string/play_video" />
<ImageView
android:id="@+id/hide_preview"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media" />
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:id="@+id/status_container2"
android:layout_weight="1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="2dp"
android:id="@+id/status_container3"
android:layout_height="0dp"
android:baselineAligned="false">
android:layout_height="match_parent">
<RelativeLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:id="@+id/status_prev3"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:visibility="gone"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:layout_weight="1"
android:layout_width="0dp"
android:id="@+id/status_prev4_container"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev4"
android:id="@+id/status_prev2"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
android:visibility="gone"
android:id="@+id/status_prev2_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="2dp"
android:id="@+id/status_container3"
android:layout_height="0dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev3"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:visibility="gone"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:layout_weight="1"
android:layout_width="0dp"
android:id="@+id/status_prev4_container"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev4"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
android:visibility="gone"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/status_show_more"
android:visibility="gone"
android:textAllCaps="false"
android:drawableLeft="@drawable/ic_photo"
android:drawableStart="@drawable/ic_photo"
android:gravity="center_vertical"
android:drawablePadding="5dp"
android:paddingLeft="10dp"
android:paddingStart="10dp"
android:paddingRight="10dp"
android:paddingEnd="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?attr/borderless"
android:text="@string/load_attachment" />
<RelativeLayout
android:visibility="gone"
android:id="@+id/status_show_more"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
>
<TextView
android:textSize="20sp"
android:gravity="center"
android:id="@+id/show_more_content"
android:layout_gravity="center"
android:layout_centerInParent="true"
android:padding="12dp"
android:background="@drawable/rounded_label_sensitive"
android:textColor="#ffffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/status_spoiler_mention_container"

View File

@ -374,276 +374,281 @@
android:layout_height="match_parent"/>
</FrameLayout>
<RelativeLayout
android:id="@+id/status_horizontal_document_container"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/horizontal_second_image"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev2_h"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev2_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="1dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev3_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev4_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/hide_preview_h"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media"/>
</RelativeLayout>
<LinearLayout
android:visibility="gone"
android:id="@+id/status_document_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginBottom="5dp"
android:baselineAligned="false">
android:layout_height="wrap_content"
>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1"
android:id="@+id/status_horizontal_document_container"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/horizontal_second_image"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev2_h"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev2_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="1dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev3_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev4_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/status_prev1_play"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
<ImageView
android:id="@+id/hide_preview"
android:id="@+id/hide_preview_h"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media" />
android:contentDescription="@string/hide_media"/>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:id="@+id/status_container2"
android:layout_weight="1"
android:layout_height="match_parent">
android:visibility="gone"
android:id="@+id/status_document_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginBottom="5dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="0dp"
android:layout_weight="1">
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev2"
android:id="@+id/status_prev1"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
/>
<ImageView
android:id="@+id/status_prev1_play"
android:visibility="gone"
android:id="@+id/status_prev2_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
android:contentDescription="@string/play_video" />
<ImageView
android:id="@+id/hide_preview"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media" />
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:id="@+id/status_container2"
android:layout_weight="1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="2dp"
android:id="@+id/status_container3"
android:layout_height="0dp"
android:baselineAligned="false">
android:layout_height="match_parent">
<RelativeLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:id="@+id/status_prev3"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:visibility="gone"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:layout_weight="1"
android:layout_width="0dp"
android:id="@+id/status_prev4_container"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev4"
android:id="@+id/status_prev2"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
android:visibility="gone"
android:id="@+id/status_prev2_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="2dp"
android:id="@+id/status_container3"
android:layout_height="0dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev3"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:visibility="gone"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:layout_weight="1"
android:layout_width="0dp"
android:id="@+id/status_prev4_container"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev4"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
android:visibility="gone"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/status_show_more"
android:visibility="gone"
android:textAllCaps="false"
android:drawableLeft="@drawable/ic_photo"
android:drawableStart="@drawable/ic_photo"
android:gravity="center_vertical"
android:drawablePadding="5dp"
android:paddingLeft="10dp"
android:paddingStart="10dp"
android:paddingRight="10dp"
android:paddingEnd="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?attr/borderless"
android:text="@string/load_attachment" />
<RelativeLayout
android:visibility="gone"
android:id="@+id/status_show_more"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
>
<TextView
android:textSize="20sp"
android:gravity="center"
android:id="@+id/show_more_content"
android:layout_gravity="center"
android:layout_centerInParent="true"
android:padding="12dp"
android:background="@drawable/rounded_label_sensitive"
android:textColor="#ffffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/status_spoiler_mention_container"

View File

@ -302,163 +302,130 @@
android:layout_height="match_parent"/>
</FrameLayout>
<RelativeLayout
android:id="@+id/status_horizontal_document_container"
android:visibility="gone"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/horizontal_second_image"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev2_h"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev2_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_marginTop="1dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev3_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev4_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/hide_preview_h"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media" />
</RelativeLayout>
<LinearLayout
android:visibility="gone"
android:layout_marginBottom="10dp"
android:id="@+id/status_document_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="200dp"
android:baselineAligned="false">
android:layout_height="wrap_content"
>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1"
android:id="@+id/status_horizontal_document_container"
android:visibility="gone"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev1_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/horizontal_second_image"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev2_h"
android:scaleType="fitCenter"
android:layout_width="match_parent"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev2_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_marginTop="1dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev3_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:layout_marginLeft="1dp"
android:layout_marginStart="1dp"
>
<ImageView
android:id="@+id/status_prev4_h"
android:layout_width="match_parent"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play_h"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/status_prev1_play"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
<ImageView
android:id="@+id/hide_preview"
android:id="@+id/hide_preview_h"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
@ -468,102 +435,144 @@
android:contentDescription="@string/hide_media" />
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:id="@+id/status_container2"
android:layout_weight="1"
android:layout_height="match_parent">
android:visibility="gone"
android:layout_marginBottom="10dp"
android:id="@+id/status_document_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="200dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="0dp"
android:layout_weight="1">
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/status_prev2"
android:id="@+id/status_prev1"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev1_play"
android:visibility="gone"
android:id="@+id/status_prev2_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video" />
<ImageView
android:id="@+id/hide_preview"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:src="@drawable/ic_remove_red_eye_img"
android:layout_height="wrap_content"
android:contentDescription="@string/hide_media" />
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:id="@+id/status_container2"
android:layout_weight="1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="2dp"
android:id="@+id/status_container3"
android:layout_height="0dp"
android:baselineAligned="false">
android:layout_height="match_parent">
<RelativeLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:id="@+id/status_prev3"
android:id="@+id/status_prev2"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play"
android:visibility="gone"
android:id="@+id/status_prev2_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:visibility="gone"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:layout_weight="1"
android:layout_width="0dp"
android:id="@+id/status_prev4_container"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev4"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
android:visibility="gone"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
android:contentDescription="@string/play_video" />
</RelativeLayout>
<LinearLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginTop="2dp"
android:id="@+id/status_container3"
android:layout_height="0dp"
android:baselineAligned="false">
<RelativeLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev3"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev3_play"
android:layout_centerInParent="true"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:visibility="gone"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
<RelativeLayout
android:layout_marginLeft="2dp"
android:layout_marginStart="2dp"
android:layout_weight="1"
android:layout_width="0dp"
android:id="@+id/status_prev4_container"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_prev4"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
android:visibility="gone"
android:layout_width="30dp"
android:src="@drawable/ic_play_arrow"
android:layout_height="30dp"
android:contentDescription="@string/play_video"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/status_show_more"
android:visibility="gone"
android:textAllCaps="false"
android:drawableLeft="@drawable/ic_photo"
android:drawableStart="@drawable/ic_photo"
android:gravity="center_vertical"
android:drawablePadding="5dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?attr/borderless"
android:text="@string/load_attachment" />
<RelativeLayout
android:visibility="gone"
android:id="@+id/status_show_more"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
>
<TextView
android:textSize="20sp"
android:gravity="center"
android:id="@+id/show_more_content"
android:layout_gravity="center"
android:layout_centerInParent="true"
android:padding="12dp"
android:background="@drawable/rounded_label_sensitive"
android:textColor="#ffffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/status_spoiler_mention_container"

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -125,7 +125,7 @@
<item>هل تود حجب هذا الحساب؟</item>
<item>هل تود الإبلاغ عن هذا التبويق؟</item>
<item>هل تريد حظر هذا النطاق؟</item>
<item>Unmute this account?</item>
<item>هل تود إلغاء كتم هذا الحساب؟</item>
</string-array>
<string-array name="action_notification">
<item>إشعار</item>
@ -215,7 +215,7 @@
<!-- Scheduled toots -->
<string name="no_scheduled_toots">ليس عندك أية تبويقات مبرمَجة للعرض!</string>
<string name="no_scheduled_toots_indications">قم بتحرير تبويق ثم اختر <b>برمَجة</b> على القائمة العلوية.</string>
<string name="remove_scheduled">هل تود حذف التبويق المُبرمَج ؟</string>
<string name="remove_scheduled">هل تود حذف التبويق المُبرمَج؟</string>
<string name="media_count">الوسائط: %d</string>
<string name="toot_scheduled">تمت برمجة التبويق بنجاح!</string>
<string name="toot_scheduled_date">يجب أن يكون تاريخ البرمجة أكبر من الساعة الحالية!</string>
@ -237,7 +237,7 @@
<item quantity="two">و إشعارين</item>
<item quantity="few">و %d اشعارات</item>
<item quantity="many">و %d اشعارات</item>
<item quantity="other">و %d اشعارات</item>
<item quantity="other">و %d إشعارات أخرى</item>
</plurals>
<plurals name="other_notif_hometimeline">
<item quantity="zero">ولا تبويق آخر لاكتشافه</item>
@ -251,12 +251,12 @@
<item quantity="zero">%d إعجاب</item>
<item quantity="one">%d إعجاب</item>
<item quantity="two">%d إعجابان</item>
<item quantity="few">%d إعجابين</item>
<item quantity="few">%d إعجابات</item>
<item quantity="many">%d إعجابات</item>
<item quantity="other">%d إعجابات</item>
</plurals>
<string name="delete_notification_ask">هل تريد حذف الإخطار؟</string>
<string name="delete_notification_ask_all">هل تود حذف كافة الإخطارات؟</string>
<string name="delete_notification_ask">هل تريد حذف الإشعار؟</string>
<string name="delete_notification_ask_all">هل تود حذف كافة الإشعارات؟</string>
<string name="delete_notification">تم حذف الإشعار بنجاح!</string>
<string name="delete_notification_all">تم حذف جميع الإشعارات بنجاح!</string>
<!-- HEADER -->
@ -280,7 +280,7 @@
<string name="toast_unstatus">تم حذف التبويق بنجاح!</string>
<string name="toast_pin">تم تثبيت التبويق بنجاح!</string>
<string name="toast_unpin">تم إلغاء تثبيت التبويق بنجاح!</string>
<string name="toast_error">عذراً ! حدث خطأ !</string>
<string name="toast_error">عذراً ! حدث خطأ!</string>
<string name="toast_code_error">طرأ هناك خطأ! لم يقم مثيل الخادم بإعادة رمز المصادقة!</string>
<string name="toast_error_instance">يبدو أنّ اسم نطاق مثيل الخادوم غير صالح!</string>
<string name="toast_error_loading_account">طرأ هناك خطأ أثناء التحوّل مِن حساب إلى آخر!</string>
@ -321,7 +321,7 @@
<string name="set_notif_follow_share">تنبيهي عندما يقوم أحدهم بترقية منشوري</string>
<string name="set_notif_follow_add">إخطاري عندما يُعجَب أحدهم بأحد منشوراتي</string>
<string name="set_notif_follow_mention">إخطاري عندما يُشار إليّ</string>
<string name="set_notif_follow_poll">Notify when a poll ended</string>
<string name="set_notif_follow_poll">أرسل إشعاراً عند انتهاء استطلاع الرأي</string>
<string name="set_share_validation">عرض مربع حوار للتأكيد قبل ترقية أي تبويق</string>
<string name="set_share_validation_fav">عرض مربع حوار للتأكيد قبل إضافة أي تبويق إلى المفضلة</string>
<string name="set_wifi_only">تفعيل الإخطار في وضع الواي فاي فقط</string>
@ -590,7 +590,7 @@
<string name="channel_notif_boost">ترقية جديدة</string>
<string name="channel_notif_fav">مفضلة جديدة</string>
<string name="channel_notif_mention">إشارة جديدة</string>
<string name="channel_notif_poll">Poll Ended</string>
<string name="channel_notif_poll">انتهى استطلاع الرأي</string>
<string name="channel_notif_toot">تبويق جديد</string>
<string name="channel_notif_backup">النسخ الاحتياطي للتبويقات</string>
<string name="channel_notif_media">تنزيل الوسائط</string>
@ -659,6 +659,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[افتح قائمة تبويق ما ثم اختر <b>برمجة ترقية</b>.]]></string>
<string name="art_menu">الخيط الفني</string>
<string name="open_menu">فتح القائمة</string>
<string name="go_back">العودة</string>
<string name="app_logo">شعار التطبيق</string>
<string name="profile_picture">الصورة الشخصية</string>
<string name="profile_banner">رأسية الصفحة الشخصية</string>
@ -676,7 +677,7 @@
<string name="card_view_image">صورة البطاقة</string>
<string name="hide_media">إخفاء الوسائط</string>
<string name="favicon">أيقونة المفضلة</string>
<string name="media_description">وصف للمعاقين بصريا</string>
<string name="media_description">إضافة وصف على الصور (للمعاقين بصريا)</string>
<string-array name="filter_expire">
<item>أبدًا</item>
<item>30 دقيقة</item>
@ -747,11 +748,11 @@
<string name="video_uploaded_action">اضغط هنا لتعديل بيانات الفيديو.</string>
<string name="delete_video">احذف الفيديو</string>
<string name="delete_video_confirmation">هل أنت متأكد أنك تود حذف هذا الفيديو؟</string>
<string name="no_video_uploaded">لم يتم ارسال أية فيديوهات بعد!</string>
<string name="no_video_uploaded">لم يتم إرسال أية فيديوهات بعد!</string>
<string name="display_nsfw_videos">عرض الفيديوهات الحساسة</string>
<string name="default_channel_of">القناة الافتراضية لـ %s</string>
<string name="no_video_to_display">لا توجد أية فيديوهات لعرضها!</string>
<string name="add_image_to_favorite">إضافة إلى المفضلة</string>
<string name="add_image_to_favorite">إضافة الوسائط إلى المفضلة</string>
<string name="leave_a_comment">اترك تعليقاً</string>
<string name="share">شارك</string>
<string name="my_pictures">صوري</string>
@ -814,7 +815,7 @@
<string name="set_retrieve_metadata_share_from_extras">ارفاق صورة عند مشاركة عنوان رابط</string>
<!-- end languages -->
<string name="poll">استطلاع رأي</string>
<string name="polls">Polls</string>
<string name="polls">استطلاعات الرأي</string>
<string name="create_poll">إنشاء استطلاع</string>
<string name="poll_choice_1">الخيار 1</string>
<string name="poll_choice_2">الخيار 2</string>
@ -827,7 +828,7 @@
<string name="vote">تصويت</string>
<string name="poll_not_private">لا يمكن إرفاق استطلاع للرأي في الرسائل المباشِرة!</string>
<string name="notif_poll">لقد انقضت مدة استطلاع رأي قد قُمتَ بالتصويت عليه مِن قَبل</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="notif_poll_self">لقد انتهت مدة استطلاع رأي قد قُمتَ بنشره</string>
<string name="settings_category_notif_customize">تخصيص</string>
<string name="settings_category_notif_categories">الفئات</string>
<string name="settings_category_notif_news">الأخبار</string>
@ -841,12 +842,12 @@
<string name="hide_timeline">إخفاء الخيط الزمني</string>
<string name="reorder_timelines">إعادة ترتيب الخيوط الزمنية</string>
<string name="undo">إلغاء</string>
<string name="visible_tabs_needed">You need to keep two visible tabs!</string>
<string name="visible_tabs_needed">يجب الإبقاء على لسانَين ظاهرين!</string>
<string name="action_reorder_timeline">إعادة ترتيب الخيوط الزمنية</string>
<string name="warning_list_deletion">Use the lists entry for deleting this list!</string>
<string name="warning_main_timeline">الخيوط الرئيسية يمكن فقط إخفاءها!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">إضافة خيط زمني</string>
<plurals name="number_of_vote">
<item quantity="zero">%d votes</item>
<item quantity="one">%d vote</item>
@ -869,7 +870,7 @@
<item>7 أيام</item>
</string-array>
<string-array name="settings_video_mode">
<item>تورنت</item>
<item>Webview</item>
<item>تدفق مباشر</item>
</string-array>
</resources>

View File

@ -636,6 +636,7 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n
<string name="no_scheduled_boosts_indications"><![CDATA[Obre el menú d'un toot i selecciona <b>Temporalitza la difusió</b>.]]></string>
<string name="art_menu">Pissarra de l\'art</string>
<string name="open_menu">Obrir menú</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo de l\'aplicació</string>
<string name="profile_picture">Foto de perfil</string>
<string name="profile_banner">Bànner de perfil</string>

View File

@ -651,6 +651,7 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během
<string name="no_scheduled_boosts_indications"><![CDATA[Otevřete menu tootu a vyberte <b>Naplánovat boost</b>.]]></string>
<string name="art_menu">Art časová osa</string>
<string name="open_menu">Otevřete nabídku</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo aplikace</string>
<string name="profile_picture">Profilový obrázek</string>
<string name="profile_banner">Profilová hlavička</string>

View File

@ -660,6 +660,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Agorwch y ddewislen ar gyfer tŵt ac yna dewiswch <b>Trefnu bŵst</b>.]]></string>
<string name="art_menu">Ffrwd gelf</string>
<string name="open_menu">Agor dewislen</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo y rhaglen</string>
<string name="profile_picture">Llun proffil</string>
<string name="profile_banner">Baner proffil</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -125,7 +125,7 @@
<item>Diesen Nutzer blockieren?</item>
<item>Diesen Toot melden?</item>
<item>Diese Domäne blockieren?</item>
<item>Nutzer nicht mehr stummschalten?</item>
<item>Lautlosmodus für dieses Konto aufheben?</item>
</string-array>
<string-array name="action_notification">
<item>Benachrichtigen</item>
@ -172,8 +172,8 @@
<string name="toot_reply_content_title">Du antwortest auf diesen Toot:</string>
<string name="toot_sensitive">Sensibler Inhalt?</string>
<string-array name="toot_visibility">
<item>Absenden an öffentliche Zeitleiste</item>
<item>Nicht an öffentliche Zeitleiste absenden</item>
<item>In öffentliche Zeitleisten eintragen</item>
<item>Nicht in öffentliche Zeitleisten eintragen</item>
<item>Nur an Folgende senden</item>
<item>Nur an erwähnten Nutzer absenden</item>
</string-array>
@ -578,7 +578,7 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n
<string name="no_blocked_domain">Keine blockierten Domänen!</string>
<string name="unblock_domain_confirm">Domäne nicht mehr blockieren</string>
<string name="unblock_domain_confirm_message">Möchten Sie %s wirklich entsperren?</string>
<string name="block_domain_confirm_message">Sicher, dass du %s blockieren möchtest?</string>
<string name="block_domain_confirm_message">Möchten Sie %s wirklich sperren?\n\nEs werden keine Inhalte aus dieser Domain in einer öffentlichen Zeitleiste oder in Ihren Benachrichtigungen angezeigt. Ihre Follower aus dieser Domain werden entfernt.</string>
<string name="blocked_domains">Blockierte Domänen</string>
<string name="block_domain">Blockiere Domäne</string>
<string name="toast_block_domain">Die Domäne ist blockiert</string>
@ -635,6 +635,7 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n
<string name="no_scheduled_boosts_indications"><![CDATA[Öffne das Menü eines Toots und wähle <b>Teilen planen</b>.]]></string>
<string name="art_menu">Kunst-Zeitlinie</string>
<string name="open_menu">Öffne Menü</string>
<string name="go_back">Zurück</string>
<string name="app_logo">Logo der Anwendung</string>
<string name="profile_picture">Profilbild</string>
<string name="profile_banner">Profilbanner</string>
@ -801,7 +802,7 @@ Sobald Sie die ersten Buchstaben eintippen, werden Namensvorschläge angezeigt\n
<string name="vote">Abstimmen</string>
<string name="poll_not_private">Eine Umfrage kann nicht an eine direkte Nachricht angehängt werden!</string>
<string name="notif_poll">Eine Umfrage, in der du abgestimmt hast, ist beendet</string>
<string name="notif_poll_self">Eine deiner Umfragen ist beendet</string>
<string name="notif_poll_self">Eine Ihrer Umfragen ist beendet</string>
<string name="settings_category_notif_customize">Anpassen</string>
<string name="settings_category_notif_categories">Kategorien</string>
<string name="settings_category_notif_news">Neuigkeiten</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Άνοιξε το κατάστιχο των επιλογών μίας φωνής και επέλεξε τον <b>Προγραμματισμό της ανύψωσης</b> .]]></string>
<string name="art_menu">Χρονοστήλη καλλιτεχνίας</string>
<string name="open_menu">Άνοιγμα του κατάλογου επιλογών</string>
<string name="go_back">Go back</string>
<string name="app_logo">Το λογότυπο της εφαρμογής</string>
<string name="profile_picture">Εικόνα του προσώπου</string>
<string name="profile_banner">Σημαία του προσώπου</string>

View File

@ -640,6 +640,7 @@ https://yandex.ru/legal/confidential/?lang=en </string>
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Línea de tiempo de arte</string>
<string name="open_menu">Abrir menú</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo de la aplicación</string>
<string name="profile_picture">Imagen del perfil</string>
<string name="profile_banner">Banner de perfil</string>

View File

@ -644,6 +644,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Ireko toot baten menua eta hautatu <b>programatu bultzada</b>.]]></string>
<string name="art_menu">Arte denbora-lerroa</string>
<string name="open_menu">Ireki menua</string>
<string name="go_back">Go back</string>
<string name="app_logo">Aplikazioaren logoa</string>
<string name="profile_picture">Profilaren Irudia</string>
<string name="profile_banner">Profileko banda</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -36,7 +36,7 @@
<string name="toast_account_changed" formatted="false">Fonctionne maintenant avec le compte %1$s</string>
<string name="add_account">Ajouter un compte</string>
<string name="clipboard">Le contenu du pouet a été copié dans le presse-papier</string>
<string name="clipboard_url">L\'URL du toot a été copiée dans le presse-papiers</string>
<string name="clipboard_url">L\'URL du pouet a été copiée dans le presse-papier</string>
<string name="change">Changer</string>
<string name="choose_picture">Sélectionnez une photo…</string>
<string name="clear">Nettoyer</string>
@ -102,7 +102,7 @@
<string name="no_status">Aucun pouet à afficher !</string>
<string name="fav_added">Pouet ajouté aux favoris !</string>
<string name="fav_removed">Pouet supprimé des favoris !</string>
<string name="reblog_added">Pouet partagé !</string>
<string name="reblog_added">Le pouet a été partagé !</string>
<string name="reblog_removed">Pouet supprimé du partage !</string>
<string name="reblog_by">Partagé par %1$s</string>
<string name="favourite_add">Ajouter ce pouet aux favoris ?</string>
@ -125,7 +125,7 @@
<item>Bloquer ce compte ?</item>
<item>Signaler ce pouet ?</item>
<item>Désirez-vous bloquer ce domaine ?</item>
<item>Unmute this account?</item>
<item>Ne plus masquer ce compte ?</item>
</string-array>
<string-array name="action_notification">
<item>Notifier</item>
@ -305,7 +305,7 @@
<string name="set_notif_follow_share">Notifier lorsque quelquun partage mes pouets</string>
<string name="set_notif_follow_add">Notifier lorsque quelquun ajoute mes pouets à ses favoris</string>
<string name="set_notif_follow_mention">Notifier lorsque quelquun me mentionne</string>
<string name="set_notif_follow_poll">Notify when a poll ended</string>
<string name="set_notif_follow_poll">Me notifier lorsquun sondage est terminé</string>
<string name="set_share_validation">Confirmer avant de partager</string>
<string name="set_share_validation_fav">Confirmer avant dajouter aux favoris</string>
<string name="set_wifi_only">Notifier en WIFI seulement</string>
@ -504,7 +504,7 @@
<string name="poxy_port">Port</string>
<string name="poxy_login">Identifiant</string>
<string name="poxy_password">Mot de passe</string>
<string name="set_theme">Thèmes :</string>
<string name="set_theme">Thème :</string>
<string name="set_compact_mode">Mode compact</string>
<string name="set_share_details">Ajouter les détails du pouet en le partageant</string>
<string name="support_the_app_on_liberapay">Soutenir lapp sur Liberapay</string>
@ -571,10 +571,10 @@
<string name="expand_image">Étendre automatiquement les médias cachés</string>
<string name="set_display_follow_instance">Afficher le bouton de suivi dinstances</string>
<string name="channel_notif_follow">Nouvel abonnement</string>
<string name="channel_notif_boost">Nouveau Repouet</string>
<string name="channel_notif_boost">Nouveau partage</string>
<string name="channel_notif_fav">Nouveau Favori</string>
<string name="channel_notif_mention">Nouvelle mention</string>
<string name="channel_notif_poll">Poll Ended</string>
<string name="channel_notif_poll">Sondage terminé</string>
<string name="channel_notif_toot">Nouveau pouet</string>
<string name="channel_notif_backup">Sauvegarde des Pouets</string>
<string name="channel_notif_media">Téléchargement des Médias</string>
@ -620,7 +620,7 @@
<string name="set_old_direct_timeline">Utiliser le fil direct antérieur à Mastodon 2.6</string>
<string name="set_display_video_preview">Afficher les aperçus des vidéos</string>
<string name="thanks_text_support">Support de Gitlab</string>
<string name="action_bug_report">Signaler un bug</string>
<string name="action_bug_report">Signaler un bogue</string>
<string name="no_mail_client">Aucun client de messagerie nest installé.</string>
<string name="bug_report_mail">Envoyer un rapport de bogue</string>
<string name="account_id_clipbloard">LID du compte été copié vers le presse-papiers!</string>
@ -643,10 +643,11 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Ouvrez le menu dun pouet puis choisissez <b>Programmer un boost</b>.]]></string>
<string name="art_menu">Fil artistique</string>
<string name="open_menu">Ouvrir le menu</string>
<string name="go_back">Retour</string>
<string name="app_logo">Logo de lapplication</string>
<string name="profile_picture">Photo du profil</string>
<string name="profile_banner">Bannière du profil</string>
<string name="contact_instance_admin">Contacter l\'administrateur de l\'instance</string>
<string name="contact_instance_admin">Contacter ladministrateur de linstance</string>
<string name="add_new">Ajouter un nouveau</string>
<string name="mastohost_logo">Logo de MastoHost</string>
<string name="emoji_picker">Sélecteur démojis</string>
@ -775,29 +776,29 @@ Le bouton de connexion sactivera une fois quun domaine valide sera renseig
<string name="action_logout_account">Déconnexion du compte</string>
<string name="set_optimize_loading">Optimiser le temps de chargement</string>
<string name="all">Tout</string>
<string name="about_opencollective">Soutenir l\'application</string>
<string name="about_opencollective">Soutenir lapplication</string>
<string name="more_about_opencollective">Open Collective permet aux groupes de créer rapidement un collectif, de collecter des fonds et de les gérer de manière transparente.</string>
<string name="copy_link">Copier le lien</string>
<string name="connect_instance">Connecter</string>
<string name="set_normal">Nomal</string>
<string name="set_normal">Normal</string>
<string name="set_compact">Compact</string>
<string name="set_console">Terminal</string>
<string name="set_mode">Définir le mode daffichage</string>
<string name="set_security_provider">Patcher le fournisseur de sécurité</string>
<string name="update_tracking_domains">Mettre à jour les domaines de suivi</string>
<string name="tracking_db_updated">La base de données de suivi a été mise à jour !</string>
<string name="calls_blocked">Appels http bloqués par l\'application</string>
<string name="calls_blocked">appels http bloqués par lapplication</string>
<string name="list_of_blocked_domains">Liste des appels bloqués</string>
<string name="submit">Envoyer</string>
<string name="data_base_exported">La base de données a été exportée!</string>
<string name="featured_hashtags">Hashtags recommandés</string>
<string name="filter_timeline_with_a_tag">Filtrer la timeline avec des tags</string>
<string name="no_tags">Aucun tag</string>
<string name="no_tags">Aucune étiquette</string>
<string name="set_hide_delete_notification_on_tab">Cacher le bouton de suppression de notification sur l\'onglet de notification</string>
<string name="set_retrieve_metadata_share_from_extras">Attacher une image lors du partage d\'une URL</string>
<!-- end languages -->
<string name="poll">Sondages</string>
<string name="polls">Polls</string>
<string name="poll">Sondage</string>
<string name="polls">Sondages</string>
<string name="create_poll">Créer un sondage</string>
<string name="poll_choice_1">Choix 1</string>
<string name="poll_choice_2">Choix 2</string>
@ -808,9 +809,9 @@ Le bouton de connexion sactivera une fois quun domaine valide sera renseig
<string name="poll_finish_at">fin à %s</string>
<string name="refresh_poll">Actualiser le sondage</string>
<string name="vote">Voter</string>
<string name="poll_not_private">Un sondage ne peut pas être attaché à un message direct!</string>
<string name="notif_poll">Le sondage auquel vous avez participé est maintenant terminé</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="poll_not_private">Un sondage ne peut pas être attaché à un message direct !</string>
<string name="notif_poll">Un sondage auquel vous avez participé est maintenant terminé</string>
<string name="notif_poll_self">Un sondage que vous avez publié est maintenant terminé</string>
<string name="settings_category_notif_customize">Personnaliser</string>
<string name="settings_category_notif_categories">Catégories</string>
<string name="settings_category_notif_news">Actualités</string>
@ -818,21 +819,21 @@ Le bouton de connexion sactivera une fois quun domaine valide sera renseig
<string name="settings_category_notif_advanced">Avancé</string>
<string name="set_display_new_badge">Afficher le badge \'new\' sur les pouets non lus</string>
<string name="set_display_peertube">Afficher le fil PeerTube</string>
<string name="peertube_menu">Peertube</string>
<string name="peertube_menu">PeerTube</string>
<string name="hide_tab">Cacher longlet</string>
<string name="move_timeline">Déplacer le fil</string>
<string name="hide_timeline">Cacher le fil</string>
<string name="reorder_timelines">Réorganiser les fils</string>
<string name="undo">Annuler</string>
<string name="visible_tabs_needed">You need to keep two visible tabs!</string>
<string name="visible_tabs_needed">Vous devez garder deux onglets visibles !</string>
<string name="action_reorder_timeline">Réorganiser les fils</string>
<string name="warning_list_deletion">Use the lists entry for deleting this list!</string>
<string name="warning_main_timeline">Main timelines can only be hidden!</string>
<string name="warning_main_timeline">Les fils principaux ne peuvent quêtre masqués !</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">Ajouter un fil</string>
<plurals name="number_of_vote">
<item quantity="one">%d vote</item>
<item quantity="other">%d votes</item>
<item quantity="one">%d voix</item>
<item quantity="other">%d voix</item>
</plurals>
<string-array name="poll_choice_type">
<item>Choix unique</item>

View File

@ -305,7 +305,7 @@
<string name="set_notif_follow_share">Notificar cando alguén promove un dos seus toots</string>
<string name="set_notif_follow_add">Notificar cando alguén favorece un dos seus estados</string>
<string name="set_notif_follow_mention">Notificar cando alguén a menciona</string>
<string name="set_notif_follow_poll">Notify when a poll ended</string>
<string name="set_notif_follow_poll">Notificar cando remate unha sondaxe</string>
<string name="set_share_validation">Solicitar confirmación antes de promover</string>
<string name="set_share_validation_fav">Solicitar confirmación antes de engadir a favoritos</string>
<string name="set_wifi_only">Notificar só cando WiFi</string>
@ -576,7 +576,7 @@
<string name="channel_notif_boost">Nova promoción</string>
<string name="channel_notif_fav">Novo favorito</string>
<string name="channel_notif_mention">Nova mención</string>
<string name="channel_notif_poll">Poll Ended</string>
<string name="channel_notif_poll">Rematou a sondaxe</string>
<string name="channel_notif_toot">Novo Toot</string>
<string name="channel_notif_backup">Respaldo de Toots</string>
<string name="channel_notif_media">Descarga de medios</string>
@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Abra o menú de un toot e escolla <b>Programar promoción</b>.]]></string>
<string name="art_menu">Liña temporal Art</string>
<string name="open_menu">Abrir menú</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo da aplicación</string>
<string name="profile_picture">Imaxe de perfil</string>
<string name="profile_banner">Banda do perfil</string>
@ -801,7 +802,7 @@
<string name="set_retrieve_metadata_share_from_extras">Obter metadatos se o URL os comparte desde outras apps</string>
<!-- end languages -->
<string name="poll">Sondaxe</string>
<string name="polls">Polls</string>
<string name="polls">Sondaxes</string>
<string name="create_poll">Crear sondaxe</string>
<string name="poll_choice_1">Opción 1</string>
<string name="poll_choice_2">Opción 2</string>
@ -814,7 +815,7 @@
<string name="vote">Votar</string>
<string name="poll_not_private">Unha sondaxe non se pode anexar a unha mensaxe directa!</string>
<string name="notif_poll">Rematou a sondaxe na que participou</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="notif_poll_self">Rematou unha sondaxe na que tooteou</string>
<string name="settings_category_notif_customize">Personalizar</string>
<string name="settings_category_notif_categories">Categorías</string>
<string name="settings_category_notif_news">Novas</string>
@ -833,7 +834,7 @@
<string name="warning_list_deletion">Utilice os axustes das listas para eliminar esta lista!</string>
<string name="warning_main_timeline">As liñas temporais principais só poden ocultarse!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">Engadir liña temporal</string>
<plurals name="number_of_vote">
<item quantity="one">%d voto</item>
<item quantity="other">%d votos</item>

View File

@ -653,6 +653,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -637,6 +637,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[एक लेख का मेन्यू खोलें और चुनें <b>बूस्ट शैड्यूल करें</b>।]]></string>
<string name="art_menu">कला टाइम्लाइन</string>
<string name="open_menu">मेन्यू खोलें</string>
<string name="go_back">Go back</string>
<string name="app_logo">एेप का चिह्न</string>
<string name="profile_picture">प्रोफ़ाइल चित्र</string>
<string name="profile_banner">प्रोफ़ाइल बैनर</string>

View File

@ -642,6 +642,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http
<string name="no_scheduled_boosts_indications"><![CDATA[Nyisd meg egy toot menüjét és válaszd az <b>Újratoot időzítése</b> opciót.]]></string>
<string name="art_menu">Művészies idővonal</string>
<string name="open_menu">Menü megnyitása</string>
<string name="go_back">Go back</string>
<string name="app_logo">Alkalmazás logója</string>
<string name="profile_picture">Profilkép</string>
<string name="profile_banner">Profilbanner</string>

View File

@ -644,6 +644,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -643,6 +643,7 @@ https://yandex.ru/legal/confidential/?lang=en
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -305,7 +305,7 @@
<string name="set_notif_follow_share">Notifica quando qualcuno ricondivide al tuo stato</string>
<string name="set_notif_follow_add">Notifica quando qualcuno mette tra i preferiti il tuo stato</string>
<string name="set_notif_follow_mention">Notifica quando qualcuno ti menziona</string>
<string name="set_notif_follow_poll">Notify when a poll ended</string>
<string name="set_notif_follow_poll">Notifica quando termina un sondaggio</string>
<string name="set_share_validation">Mostra finestra di dialogo prima della ricondivisione</string>
<string name="set_share_validation_fav">Mostra finestra di dialogo prima di aggiungere ai preferiti</string>
<string name="set_wifi_only">Notifica solo in WIFI</string>
@ -576,7 +576,7 @@
<string name="channel_notif_boost">Un nuovo boost</string>
<string name="channel_notif_fav">Un nuovo mi piace</string>
<string name="channel_notif_mention">Una nuova menzione</string>
<string name="channel_notif_poll">Poll Ended</string>
<string name="channel_notif_poll">Sondaggio terminato</string>
<string name="channel_notif_toot">Un nuovo toot</string>
<string name="channel_notif_backup">Backup dei toot</string>
<string name="channel_notif_media">Scarica i media</string>
@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Apri il menu di un toot e poi premi <b>Programma boost</b>.]]></string>
<string name="art_menu">Timeline Arte</string>
<string name="open_menu">Apri menu</string>
<string name="go_back">Torna indietro</string>
<string name="app_logo">Logo dell\'applicazione</string>
<string name="profile_picture">Immagine di profilo</string>
<string name="profile_banner">Immagine di copertina</string>
@ -800,7 +801,7 @@
<string name="set_retrieve_metadata_share_from_extras">Recupera metadati se l\'URL che condivide da altre applicazioni</string>
<!-- end languages -->
<string name="poll">Sondaggio</string>
<string name="polls">Polls</string>
<string name="polls">Sondaggi</string>
<string name="create_poll">Crea un sondaggio</string>
<string name="poll_choice_1">Scelta 1</string>
<string name="poll_choice_2">Scelta 2</string>
@ -813,7 +814,7 @@
<string name="vote">Vota</string>
<string name="poll_not_private">Un sondaggio non può essere allegato ad un messaggio diretto!</string>
<string name="notif_poll">Un sondaggio in cui hai votato è terminato</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="notif_poll_self">Un tuo sondaggio è terminato</string>
<string name="settings_category_notif_customize">Personalizza</string>
<string name="settings_category_notif_categories">Categorie</string>
<string name="settings_category_notif_news">Novità</string>
@ -832,7 +833,7 @@
<string name="warning_list_deletion">Usa la voce delle liste per eliminare questa lista!</string>
<string name="warning_main_timeline">Le timeline principali possono solo essere nascoste!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">Aggiungi una timeline</string>
<plurals name="number_of_vote">
<item quantity="one">%d voto</item>
<item quantity="other">%d voti</item>

View File

@ -633,6 +633,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[トゥートのメニューを開いて、<b>ブースト予約</b>を選択してください。]]></string>
<string name="art_menu">アートタイムライン</string>
<string name="open_menu">メニューを開く</string>
<string name="go_back">Go back</string>
<string name="app_logo">アプリケーションのロゴ</string>
<string name="profile_picture">プロフィールの写真</string>
<string name="profile_banner">プロフィールのバナー</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Ldi umuγ</string>
<string name="go_back">Go back</string>
<string name="app_logo">Alugu n wesnas</string>
<string name="profile_picture">Tugna n umaγnu</string>
<string name="profile_banner">Profile banner</string>

View File

@ -641,6 +641,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open het menu van een toot en kies <b>Boost inplannen</b>.]]></string>
<string name="art_menu">Kunsttijdlijn</string>
<string name="open_menu">Menu openen</string>
<string name="go_back">Ga terug</string>
<string name="app_logo">Logo van de applicatie</string>
<string name="profile_picture">Avatar</string>
<string name="profile_banner">Omslagfoto op profiel</string>

View File

@ -305,7 +305,7 @@
<string name="set_notif_follow_share">Varsle når noen booster tootene dine</string>
<string name="set_notif_follow_add">Varsle når noen favoriserer tootene dine</string>
<string name="set_notif_follow_mention">Varsle når noen nevner deg</string>
<string name="set_notif_follow_poll">Notify when a poll ended</string>
<string name="set_notif_follow_poll">Varsle når en avstemming er avsluttet</string>
<string name="set_share_validation">Vis bekreftelsesdialog før du booster</string>
<string name="set_share_validation_fav">Vis bekreftelsesdialog før du legger til i favoritter</string>
<string name="set_wifi_only">Varsle kun på WIFI</string>
@ -567,7 +567,7 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi
<string name="channel_notif_boost">Ny boost</string>
<string name="channel_notif_fav">Ny favoritt</string>
<string name="channel_notif_mention">Ny nevning</string>
<string name="channel_notif_poll">Poll Ended</string>
<string name="channel_notif_poll">Avstemming avsluttet</string>
<string name="channel_notif_toot">Ny toot</string>
<string name="channel_notif_backup">Backup av toots</string>
<string name="channel_notif_media">Last ned media</string>
@ -636,6 +636,7 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi
<string name="no_scheduled_boosts_indications"><![CDATA[Åpne menyen på et toot, og velg <b>Planlegg boost</b>.]]></string>
<string name="art_menu">Kunsttidslinje</string>
<string name="open_menu">Åpne meny</string>
<string name="go_back">Tilbake</string>
<string name="app_logo">Applikasjonens logo</string>
<string name="profile_picture">Profilbilde</string>
<string name="profile_banner">Profilfane</string>
@ -788,7 +789,7 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n
<string name="set_retrieve_metadata_share_from_extras">Tilknytt et bilde når du deler en URL</string>
<!-- end languages -->
<string name="poll">Avstemning</string>
<string name="polls">Polls</string>
<string name="polls">Avstemminger</string>
<string name="create_poll">Lag en avstemming</string>
<string name="poll_choice_1">Valg 1</string>
<string name="poll_choice_2">Valg 2</string>
@ -801,7 +802,7 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n
<string name="vote">Stem</string>
<string name="poll_not_private">En avstemming kan ikke kobles til en direktemelding!</string>
<string name="notif_poll">En avstemming du har stemt på er avsluttet</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="notif_poll_self">En avstemming du har tootet er avsluttet</string>
<string name="settings_category_notif_customize">Tilpass</string>
<string name="settings_category_notif_categories">Kategorier</string>
<string name="settings_category_notif_news">Nyheter</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -650,6 +650,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Otwórz menu toota i wybierz <b>Zaplanuj podbicie</b>.]]></string>
<string name="art_menu">Oś sztuki</string>
<string name="open_menu">Otwórz menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo aplikacji</string>
<string name="profile_picture">Zdjęcie profilowe</string>
<string name="profile_banner">Baner profilowy</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Abrir um menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Foto do perfil</string>
<string name="profile_banner">Profile banner</string>

View File

@ -646,6 +646,7 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație.
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -653,6 +653,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Откройте меню тута и выберите <b>Запланировать продвижение</b>.]]></string>
<string name="art_menu">Лента Art</string>
<string name="open_menu">Открыть меню</string>
<string name="go_back">Назад</string>
<string name="app_logo">Логотип приложения</string>
<string name="profile_picture">Изображение профиля</string>
<string name="profile_banner">Баннер профиля</string>

View File

@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">කලා කාල රේඛාව</string>
<string name="open_menu">මෙනුව විවෘත කරන්න</string>
<string name="go_back">Go back</string>
<string name="app_logo">මෘදුකාංගයේ ලාංඡනය</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -653,6 +653,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Odprite meni objave in nato izberite <b>Doliči čas ojačanja</b>.]]></string>
<string name="art_menu">Umetniška časovnica</string>
<string name="open_menu">Odpri meni</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logotip aplikacije</string>
<string name="profile_picture">Profilna slika</string>
<string name="profile_banner">Plakat profila</string>

View File

@ -649,6 +649,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Отворите мени тута и одаберите <b>Закажи подршку</b>.]]></string>
<string name="art_menu">Уметничка лајна</string>
<string name="open_menu">Отвори мени</string>
<string name="go_back">Go back</string>
<string name="app_logo">Логотип апликације</string>
<string name="profile_picture">Профилна слика</string>
<string name="profile_banner">Профилни банер</string>

View File

@ -236,7 +236,7 @@
<item quantity="other">lägg till %d till toot att utforska</item>
</plurals>
<plurals name="likes">
<item quantity="one">%d like</item>
<item quantity="one">%d gillar</item>
<item quantity="other">%d gillar</item>
</plurals>
<string name="delete_notification_ask">Ta bort notifiering?</string>
@ -645,6 +645,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Öppna menyn på en boost och välj <b>Schemalägg boost</b>.]]></string>
<string name="art_menu">Konstidslinje</string>
<string name="open_menu">Öppna menyn</string>
<string name="go_back">Gå tillbaka</string>
<string name="app_logo">Applikationens logo</string>
<string name="profile_picture">Profilbild</string>
<string name="profile_banner">Profil banner</string>
@ -813,7 +814,7 @@
<string name="vote">Rösta</string>
<string name="poll_not_private">En undersökning kan inte bifogas i ett direktmeddelande!</string>
<string name="notif_poll">En enkät som du röstat i har avslutats</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="notif_poll_self">En enkät som du röstat i har avslutats</string>
<string name="settings_category_notif_customize">Anpassa</string>
<string name="settings_category_notif_categories">Kategorier</string>
<string name="settings_category_notif_news">Nyheter</string>
@ -832,10 +833,10 @@
<string name="warning_list_deletion">Använd posten listor för att ta bort denna lista!</string>
<string name="warning_main_timeline">Huvudtidslinjen kan bara döljas!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">Lägg till en tidslinje</string>
<plurals name="number_of_vote">
<item quantity="one">%d röst</item>
<item quantity="other">%d votes</item>
<item quantity="other">%d röster</item>
</plurals>
<string-array name="poll_choice_type">
<item>Enkel val</item>
@ -851,7 +852,7 @@
<item>7 dagar</item>
</string-array>
<string-array name="settings_video_mode">
<item>Webview</item>
<item>Direkt stream</item>
<item>Webbvy</item>
<item>Direktström</item>
</string-array>
</resources>

View File

@ -638,6 +638,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -643,6 +643,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -639,6 +639,7 @@ và %d toots khác để khám phá</item>
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>

View File

@ -641,6 +641,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[打开嘟文的菜单,然后选择 <b>定时转嘟</b>。]]></string>
<string name="art_menu">艺术时间线</string>
<string name="open_menu">打开菜单</string>
<string name="go_back">返回</string>
<string name="app_logo">应用程序的徽标</string>
<string name="profile_picture">个人资料图片</string>
<string name="profile_banner">个人资料横幅</string>

View File

@ -641,6 +641,7 @@ Yandex 有適當的隱私權政策可以在這裡找到https://yandex.ru/l
<string name="no_scheduled_boosts_indications"><![CDATA[開啟嘟文選單然後選擇<b>排程轉嘟</b>。]]></string>
<string name="art_menu">藝術時間軸</string>
<string name="open_menu">開啟選單</string>
<string name="go_back">返回</string>
<string name="app_logo">應用程式圖示</string>
<string name="profile_picture">個人檔案照片</string>
<string name="profile_banner">個人檔案封面照片</string>

View File

@ -718,6 +718,7 @@
<string name="no_scheduled_boosts_indications"><![CDATA[Open the menu of a toot and then choose <b>Schedule boost</b>.]]></string>
<string name="art_menu">Art timeline</string>
<string name="open_menu">Open menu</string>
<string name="go_back">Go back</string>
<string name="app_logo">Logo of the application</string>
<string name="profile_picture">Profile picture</string>
<string name="profile_banner">Profile banner</string>
@ -939,6 +940,7 @@
<string name="warning_main_timeline">Main timelines can only be hidden!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="set_sensitive_content">Always mark media as sensitive</string>
<plurals name="number_of_vote">
<item quantity="one">%d vote</item>

View File

@ -0,0 +1,13 @@
Added
* Blur sensitive media
* Automatically federate accounts when searching (Mastodon/Pleroma/Peertube/Pixelfed/GNU)
* Media can be set always as sensitive (synced with Mastodon)
* Searches on a Peertube timeline filter videos
Changed
* Add a back button in account viewer
* Make the menu button dark in light theme for account viewer
Fixed
* Fix an issue when following an instance
* Fix layout for tabs when there are few ones