Merge branch 'develop' into pleroma_admin

This commit is contained in:
stom79 2019-01-29 18:06:10 +01:00
commit 2c8d0fb6d0
17 changed files with 384 additions and 292 deletions

View File

@ -1262,6 +1262,9 @@ public abstract class BaseMainActivity extends BaseActivity
startActivity(myIntent);
finish();
return true;
case R.id.action_logout_account:
Helper.logoutCurrentUser(BaseMainActivity.this);
return true;
case R.id.action_privacy:
Intent intent = new Intent(getApplicationContext(), PrivacyActivity.class);
startActivity(intent);

View File

@ -97,11 +97,14 @@ public class LoginActivity extends BaseActivity {
private CheckBox peertube_instance;
private Button connectionButton;
private String actionToken;
private String autofilledInstance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle b = getIntent().getExtras();
if(b != null) {
autofilledInstance = b.getString("instance", null);
}
if( getIntent() != null && getIntent().getData() != null && getIntent().getData().toString().contains("mastalab://backtomastalab?code=")){
String url = getIntent().getData().toString();
String val[] = url.split("code=");
@ -190,6 +193,7 @@ public class LoginActivity extends BaseActivity {
info_2FA = findViewById(R.id.info_2FA);
peertube_instance = findViewById(R.id.peertube_instance);
peertube_instance.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@ -386,6 +390,11 @@ public class LoginActivity extends BaseActivity {
}
});
}
if( autofilledInstance != null){
login_instance.setText(autofilledInstance.trim());
retrievesClientId();
login_uid.requestFocus();
}
}
@Override

View File

@ -82,6 +82,7 @@ public class Account implements Parcelable {
private String display_name, stored_displayname;
private boolean locked;
private Date created_at;
private Date updated_at;
private int followers_count;
private int following_count;
private int statuses_count;
@ -136,6 +137,7 @@ public class Account implements Parcelable {
dest.writeString(this.stored_displayname);
dest.writeByte(this.locked ? (byte) 1 : (byte) 0);
dest.writeLong(this.created_at != null ? this.created_at.getTime() : -1);
dest.writeLong(this.updated_at != null ? this.updated_at.getTime() : -1);
dest.writeInt(this.followers_count);
dest.writeInt(this.following_count);
dest.writeInt(this.statuses_count);
@ -186,6 +188,8 @@ public class Account implements Parcelable {
this.locked = in.readByte() != 0;
long tmpCreated_at = in.readLong();
this.created_at = tmpCreated_at == -1 ? null : new Date(tmpCreated_at);
long tmpUpdated_at = in.readLong();
this.updated_at = tmpUpdated_at == -1 ? null : new Date(tmpUpdated_at);
this.followers_count = in.readInt();
this.following_count = in.readInt();
this.statuses_count = in.readInt();
@ -372,6 +376,14 @@ public class Account implements Parcelable {
isAdmin = admin;
}
public Date getUpdated_at() {
return updated_at;
}
public void setUpdated_at(Date updated_at) {
this.updated_at = updated_at;
}
public enum followAction{
FOLLOW,

View File

@ -290,7 +290,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
ImageView conversation_pp_3;
ImageView conversation_pp_4;
LinearLayout conversation_pp;
LinearLayout vertical_content;
RelativeLayout status_prev4_container;
TextView status_reply;
ImageView status_pin;
@ -399,7 +398,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
conversation_pp_4 = itemView.findViewById(R.id.conversation_pp_4);
conversation_pp_2_container = itemView.findViewById(R.id.conversation_pp_2_container);
conversation_pp_3_container = itemView.findViewById(R.id.conversation_pp_3_container);
vertical_content = itemView.findViewById(R.id.vertical_content);
left_buttons = itemView.findViewById(R.id.left_buttons);
status_show_more_content = itemView.findViewById(R.id.status_show_more_content);
spark_button_fav = itemView.findViewById(R.id.spark_button_fav);
@ -786,24 +784,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
holder.status_account_displayname.setCompoundDrawables(null, null, null, null);
holder.status_account_displayname_owner.setCompoundDrawables(null, null, imgConversation, null);
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams paramsB = new LinearLayout.LayoutParams((int) Helper.convertDpToPixel(60, context), LinearLayout.LayoutParams.WRAP_CONTENT);
if (status.getReblog() == null && !isCompactMode && getItemViewType(viewHolder.getAdapterPosition()) != FOCUSED_STATUS) {
params.setMargins(0, -(int) Helper.convertDpToPixel(10, context), 0, 0);
if (status.getSpoiler_text() != null && status.getSpoiler_text().trim().length() > 0)
paramsB.setMargins(0, (int) Helper.convertDpToPixel(10, context), 0, 0);
else
paramsB.setMargins(0, (int) Helper.convertDpToPixel(15, context), 0, 0);
} else if (!isCompactMode && getItemViewType(viewHolder.getAdapterPosition()) != FOCUSED_STATUS) {
if (status.getContent() == null || status.getContent().trim().equals("")) {
params.setMargins(0, -(int) Helper.convertDpToPixel(20, context), 0, 0);
paramsB.setMargins(0, (int) Helper.convertDpToPixel(20, context), 0, 0);
} else {
params.setMargins(0, 0, 0, 0);
paramsB.setMargins(0, 0, 0, 0);
}
}
if( expand_media && status.isSensitive() || (status.getReblog() != null && status.getReblog().isSensitive())) {
changeDrawableColor(context, holder.hide_preview, R.color.red_1);
changeDrawableColor(context, holder.hide_preview_h, R.color.red_1);
@ -812,8 +792,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
changeDrawableColor(context, holder.hide_preview_h, R.color.white);
}
holder.vertical_content.setLayoutParams(params);
holder.left_buttons.setLayoutParams(paramsB);
if (!status.isClickable())
Status.transform(context, status);
if (!status.isEmojiFound())
@ -1157,6 +1135,13 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
}
/*if (expand_cw)
holder.status_spoiler_button.setVisibility(View.GONE);*/
String contentCheck = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
contentCheck = Html.fromHtml(status.getReblog() == null?status.getContent():status.getReblog().getContent(), Html.FROM_HTML_MODE_LEGACY).toString();
else
//noinspection deprecation
contentCheck = Html.fromHtml(status.getReblog() == null?status.getContent():status.getReblog().getContent()).toString();
if (status.getReblog() == null) {
if (status.getSpoiler_text() != null && status.getSpoiler_text().trim().length() > 0) {
holder.status_spoiler_container.setVisibility(View.VISIBLE);
@ -1198,6 +1183,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
holder.status_content_container.setVisibility(View.VISIBLE);
}
}
if (status.getReblog() == null) {
if (status.getMedia_attachments().size() < 1) {
holder.status_horizontal_document_container.setVisibility(View.GONE);
@ -1296,7 +1282,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
holder.status_content.setVisibility(View.VISIBLE);
holder.status_content_translated_container.setVisibility(View.GONE);
}
if( contentCheck.trim().length() < 2)
holder.status_content.setVisibility(View.GONE);
else
holder.status_content.setVisibility(View.VISIBLE);
//TODO:It sounds that sometimes this value is null - need deeper investigation
if (status.getVisibility() == null)
status.setVisibility("public");

View File

@ -69,11 +69,11 @@ public class CrossActions {
private static List<Account> connectedAccounts(Context context, Status status, boolean limitedToOwner){
final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
List<Account> accountstmp = new AccountDAO(context, db).getAllAccount();
List<Account> accountstmp = new AccountDAO(context, db).getAllAccountCrossAction();
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
Account currentAccount = new AccountDAO(context, db).getAccountByID(userId);
List<Account> accounts = new ArrayList<>();
if( !limitedToOwner && accountstmp.size() > 1 ){
if( accountstmp != null && !limitedToOwner && accountstmp.size() > 1 ){
//It's for a reply
if( status != null){
//Status is private or direct

View File

@ -543,6 +543,45 @@ public class Helper {
editor.apply();
}
/**
* Log out the authenticated user by removing its token
* @param context Context
*/
public static void logoutCurrentUser(Activity activity) {
SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
//Current user
String currentToken = sharedpreferences.getString(PREF_KEY_OAUTH_TOKEN, null);
SQLiteDatabase db = Sqlite.getInstance(activity, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
Account account = new AccountDAO(activity, db).getAccountByToken(currentToken);
account.setToken("null");
new AccountDAO(activity, db).updateAccount(account);
Account newAccount = new AccountDAO(activity, db).getLastUsedAccount();
SharedPreferences.Editor editor = sharedpreferences.edit();
if( newAccount == null){
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, null);
editor.putString(Helper.CLIENT_ID, null);
editor.putString(Helper.CLIENT_SECRET, null);
editor.putString(Helper.PREF_KEY_ID, null);
editor.putBoolean(Helper.PREF_IS_MODERATOR, false);
editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, false);
editor.putString(Helper.PREF_INSTANCE, null);
editor.putString(Helper.ID, null);
editor.apply();
}else{
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, newAccount.getToken());
editor.putString(Helper.PREF_KEY_ID, newAccount.getId());
editor.putString(Helper.PREF_INSTANCE, newAccount.getInstance().trim());
editor.putBoolean(Helper.PREF_IS_MODERATOR, newAccount.isModerator());
editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, newAccount.isAdmin());
editor.commit();
Intent changeAccount = new Intent(activity, MainActivity.class);
changeAccount.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
activity.finish();
activity.startActivity(changeAccount);
}
}
/**
* Convert String date from Mastodon
@ -1681,21 +1720,27 @@ public class Helper {
subActionButtonAcc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, accountChoice.getToken());
editor.putString(Helper.PREF_KEY_ID, accountChoice.getId());
editor.putString(Helper.PREF_INSTANCE, accountChoice.getInstance().trim());
editor.putBoolean(Helper.PREF_IS_MODERATOR, accountChoice.isModerator());
editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, accountChoice.isAdmin());
editor.commit();
if(accountChoice.getSocial() != null && accountChoice.getSocial().equals("PEERTUBE"))
Toasty.info(activity, activity.getString(R.string.toast_account_changed, "@" + accountChoice.getAcct()), Toast.LENGTH_LONG).show();
else
Toasty.info(activity, activity.getString(R.string.toast_account_changed, "@" + accountChoice.getAcct() + "@" + accountChoice.getInstance()), Toast.LENGTH_LONG).show();
Intent changeAccount = new Intent(activity, MainActivity.class);
changeAccount.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
activity.finish();
activity.startActivity(changeAccount);
if( !accountChoice.getToken().equals("null")) {
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, accountChoice.getToken());
editor.putString(Helper.PREF_KEY_ID, accountChoice.getId());
editor.putString(Helper.PREF_INSTANCE, accountChoice.getInstance().trim());
editor.putBoolean(Helper.PREF_IS_MODERATOR, accountChoice.isModerator());
editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, accountChoice.isAdmin());
editor.commit();
if (accountChoice.getSocial() != null && accountChoice.getSocial().equals("PEERTUBE"))
Toasty.info(activity, activity.getString(R.string.toast_account_changed, "@" + accountChoice.getAcct()), Toast.LENGTH_LONG).show();
else
Toasty.info(activity, activity.getString(R.string.toast_account_changed, "@" + accountChoice.getAcct() + "@" + accountChoice.getInstance()), Toast.LENGTH_LONG).show();
Intent changeAccount = new Intent(activity, MainActivity.class);
changeAccount.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
activity.finish();
activity.startActivity(changeAccount);
}else{ //The account was logged out
Intent intent = new Intent(activity, LoginActivity.class);
intent.putExtra("instance", accountChoice.getInstance());
activity.startActivity(intent);
}
}
});
actionMenuAccBuilder.addSubActionView(subActionButtonAcc);
@ -1736,17 +1781,23 @@ public class Helper {
public void onClick(View v) {
for(final Account accountChoice: accounts) {
if (!currrentUserId.equals(accountChoice.getId())) {
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, accountChoice.getToken());
editor.putString(Helper.PREF_KEY_ID, accountChoice.getId());
editor.putString(Helper.PREF_INSTANCE, accountChoice.getInstance().trim());
editor.putBoolean(Helper.PREF_IS_MODERATOR, accountChoice.isModerator());
editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, accountChoice.isAdmin());
editor.commit();
Intent changeAccount = new Intent(activity, MainActivity.class);
changeAccount.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
activity.finish();
activity.startActivity(changeAccount);
if( !accountChoice.getToken().equals("null")) {
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, accountChoice.getToken());
editor.putString(Helper.PREF_KEY_ID, accountChoice.getId());
editor.putString(Helper.PREF_INSTANCE, accountChoice.getInstance().trim());
editor.putBoolean(Helper.PREF_IS_MODERATOR, accountChoice.isModerator());
editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, accountChoice.isAdmin());
editor.commit();
Intent changeAccount = new Intent(activity, MainActivity.class);
changeAccount.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
activity.finish();
activity.startActivity(changeAccount);
}else{ //The account was logged out
Intent intent = new Intent(activity, LoginActivity.class);
intent.putExtra("instance", accountChoice.getInstance());
activity.startActivity(intent);
}
}
}
}

View File

@ -125,7 +125,7 @@ public class NotificationsSyncJob extends Job {
return;
//If WIFI only and on WIFI OR user defined any connections to use the service.
if(!sharedpreferences.getBoolean(Helper.SET_WIFI_ONLY, false) || Helper.isOnWIFI(getContext())) {
List<Account> accounts = new AccountDAO(getContext(),db).getAllAccount();
List<Account> accounts = new AccountDAO(getContext(),db).getAllAccountCrossAction();
//It means there is no user in DB.
if( accounts == null )
return;

View File

@ -126,7 +126,7 @@ public class LiveNotificationService extends Service implements NetworkStateRece
}
it.remove();
}
List<Account> accountStreams = new AccountDAO(getApplicationContext(), db).getAllAccount();
List<Account> accountStreams = new AccountDAO(getApplicationContext(), db).getAllAccountCrossAction();
if (accountStreams != null) {
for (final Account accountStream : accountStreams) {
if( accountStream.getSocial() == null || accountStream.getSocial().equals("MASTODON")) {

View File

@ -148,6 +148,20 @@ public class AccountDAO {
}
}
/**
* Returns last used account
* @return Account
*/
public Account getLastUsedAccount(){
try {
Cursor c = db.query(Sqlite.TABLE_USER_ACCOUNT, null, Sqlite.COL_OAUTHTOKEN + " != 'null'", null, null, null, Sqlite.COL_UPDATED_AT + " DESC", "1");
return cursorToUser(c);
} catch (Exception e) {
return null;
}
}
/**
* Returns an Account by its id and acct
* @param accountId String
@ -192,6 +206,34 @@ public class AccountDAO {
}
}
/**
* Returns all Account in db
* @return Account List<Account>
*/
public List<Account> getAllAccountActivated(){
try {
Cursor c = db.query(Sqlite.TABLE_USER_ACCOUNT, null, Sqlite.COL_OAUTHTOKEN + " != 'null'", null, null, null, Sqlite.COL_INSTANCE + " ASC", null);
return cursorToListUser(c);
} catch (Exception e) {
return null;
}
}
/**
* Returns all Account in db
* @return Account List<Account>
*/
public List<Account> getAllAccountCrossAction(){
try {
Cursor c = db.query(Sqlite.TABLE_USER_ACCOUNT, null, Sqlite.COL_SOCIAL + " != 'PEERTUBE' AND " + Sqlite.COL_OAUTHTOKEN + " != 'null'", null, null, null, Sqlite.COL_INSTANCE + " ASC", null);
return cursorToListUser(c);
} catch (Exception e) {
return null;
}
}
/**
* Returns an Account by token
@ -252,6 +294,7 @@ public class AccountDAO {
account.setAvatar_static(c.getString(c.getColumnIndex(Sqlite.COL_AVATAR_STATIC)));
account.setHeader(c.getString(c.getColumnIndex(Sqlite.COL_HEADER)));
account.setHeader_static(c.getString(c.getColumnIndex(Sqlite.COL_HEADER_STATIC)));
account.setUpdated_at(Helper.stringToDate(context, c.getString(c.getColumnIndex(Sqlite.COL_UPDATED_AT))));
account.setCreated_at(Helper.stringToDate(context, c.getString(c.getColumnIndex(Sqlite.COL_CREATED_AT))));
account.setInstance(c.getString(c.getColumnIndex(Sqlite.COL_INSTANCE)));
account.setEmojis(Helper.restoreEmojisFromString(c.getString(c.getColumnIndex(Sqlite.COL_EMOJIS))));
@ -295,6 +338,7 @@ public class AccountDAO {
account.setAvatar_static(c.getString(c.getColumnIndex(Sqlite.COL_AVATAR_STATIC)));
account.setHeader(c.getString(c.getColumnIndex(Sqlite.COL_HEADER)));
account.setHeader_static(c.getString(c.getColumnIndex(Sqlite.COL_HEADER_STATIC)));
account.setUpdated_at(Helper.stringToDate(context, c.getString(c.getColumnIndex(Sqlite.COL_UPDATED_AT))));
account.setCreated_at(Helper.stringToDate(context, c.getString(c.getColumnIndex(Sqlite.COL_CREATED_AT))));
account.setInstance(c.getString(c.getColumnIndex(Sqlite.COL_INSTANCE)));
account.setToken(c.getString(c.getColumnIndex(Sqlite.COL_OAUTHTOKEN)));

View File

@ -26,7 +26,7 @@ import android.database.sqlite.SQLiteOpenHelper;
public class Sqlite extends SQLiteOpenHelper {
public static final int DB_VERSION = 25;
public static final int DB_VERSION = 26;
public static final String DB_NAME = "mastodon_etalab_db";
public static SQLiteDatabase db;
private static Sqlite sInstance;
@ -88,6 +88,7 @@ public class Sqlite extends SQLiteOpenHelper {
static final String COL_REFRESH_TOKEN = "REFRESH_TOKEN";
static final String COL_IS_MODERATOR = "IS_MODERATOR";
static final String COL_IS_ADMIN = "IS_ADMIN";
static final String COL_UPDATED_AT = "UPDATED_AT";
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, "
@ -101,6 +102,7 @@ public class Sqlite extends SQLiteOpenHelper {
+ COL_IS_MODERATOR + " INTEGER DEFAULT 0, "
+ COL_IS_ADMIN + " INTEGER DEFAULT 0, "
+ COL_CLIENT_ID + " TEXT, " + COL_CLIENT_SECRET + " TEXT, " + COL_REFRESH_TOKEN + " TEXT,"
+ COL_UPDATED_AT + " TEXT, "
+ COL_INSTANCE + " TEXT NOT NULL, " + COL_OAUTHTOKEN + " TEXT NOT NULL, " + COL_CREATED_AT + " TEXT NOT NULL)";
@ -325,6 +327,8 @@ public class Sqlite extends SQLiteOpenHelper {
case 24:
db.execSQL("ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_IS_MODERATOR + " INTEGER DEFAULT 0");
db.execSQL("ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_IS_ADMIN + " INTEGER DEFAULT 0");
case 25:
db.execSQL("ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_UPDATED_AT + " TEXT");
default:
break;
}

View File

@ -34,13 +34,14 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:baselineAligned="false">
<!-- LEFT COLUMN -->
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="50dp"
android:orientation="vertical"
>
<RelativeLayout
android:layout_height="wrap_content"
android:layout_height="60dp"
android:layout_width="match_parent"
>
<ImageView
@ -130,7 +131,43 @@
android:visibility="gone"
android:contentDescription="@string/profile_picture" />
</RelativeLayout>
<LinearLayout
android:id="@+id/left_buttons"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/new_element"
android:layout_gravity="center_horizontal"
android:src="@drawable/ic_fiber_new"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/new_toot" />
<ImageButton
android:id="@+id/status_translate"
android:layout_gravity="center_horizontal"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_translate"
android:contentDescription="@string/translate"
style="@style/Base.Widget.AppCompat.Button.Colored"
/>
<ImageButton
android:id="@+id/status_bookmark"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:tint="@android:color/white"
style="@style/Base.Widget.AppCompat.Button.Colored"
android:layout_width="40dp"
android:layout_height="40dp"
android:contentDescription="@string/bookmarks"
android:src="@drawable/ic_bookmark_border"
android:layout_marginTop="5dp"
/>
</LinearLayout>
</LinearLayout>
<!-- RIGHT COLUMN -->
<LinearLayout
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
@ -180,82 +217,33 @@
android:gravity="end"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/vertical_content"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_marginStart="60dp"
android:layout_marginLeft="60dp"
android:id="@+id/status_spoiler_container"
android:layout_width="match_parent"
android:orientation="vertical"
android:visibility="gone"
android:layout_height="wrap_content">
<fr.gouv.etalab.mastodon.helper.CustomTextView
android:id="@+id/status_spoiler"
android:layout_marginBottom="10dp"
android:textIsSelectable="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/status_spoiler_button"
android:textAllCaps="false"
android:drawableLeft="@drawable/ic_remove_red_eye"
android:drawableStart="@drawable/ic_remove_red_eye"
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_spoiler" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- SPOILER CONTAINER -->
<LinearLayout
android:id="@+id/left_buttons"
android:id="@+id/status_spoiler_container"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_width="60dp"
android:paddingEnd="10dp"
android:paddingRight="10dp"
android:visibility="gone"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/new_element"
android:layout_gravity="center_horizontal"
android:src="@drawable/ic_fiber_new"
android:layout_width="wrap_content"
<fr.gouv.etalab.mastodon.helper.CustomTextView
android:id="@+id/status_spoiler"
android:layout_marginBottom="10dp"
android:textIsSelectable="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/status_spoiler_button"
android:textAllCaps="false"
android:drawableLeft="@drawable/ic_remove_red_eye"
android:drawableStart="@drawable/ic_remove_red_eye"
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"
android:contentDescription="@string/new_toot" />
<ImageButton
android:id="@+id/status_translate"
android:layout_gravity="center_horizontal"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_translate"
android:contentDescription="@string/translate"
style="@style/Base.Widget.AppCompat.Button.Colored"
/>
<ImageButton
android:id="@+id/status_bookmark"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:tint="@android:color/white"
style="@style/Base.Widget.AppCompat.Button.Colored"
android:layout_width="40dp"
android:layout_height="40dp"
android:contentDescription="@string/bookmarks"
android:src="@drawable/ic_bookmark_border"
android:layout_marginTop="5dp"
/>
style="?attr/borderless"
android:text="@string/load_attachment_spoiler" />
</LinearLayout>
<LinearLayout
android:id="@+id/status_content_container"
@ -586,7 +574,7 @@
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
/>
<ImageView
android:visibility="gone"
android:id="@+id/status_prev2_play"
@ -636,7 +624,7 @@
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:layout_height="match_parent"
/>
/>
<ImageView
android:id="@+id/status_prev4_play"
android:layout_centerInParent="true"
@ -666,151 +654,150 @@
style="?attr/borderless"
android:text="@string/load_attachment" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_marginStart="60dp"
android:layout_marginLeft="60dp"
android:id="@+id/status_spoiler_mention_container"
android:layout_width="match_parent"
android:orientation="vertical"
android:visibility="gone"
android:layout_height="wrap_content">
<TextView
android:id="@+id/status_mention_spoiler"
android:layout_marginBottom="10dp"
<LinearLayout
android:id="@+id/status_spoiler_mention_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_marginStart="60dp"
android:layout_marginLeft="60dp"
android:id="@+id/status_peertube_container"
android:layout_width="match_parent"
android:visibility="gone"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:textColor="?colorAccent"
android:orientation="vertical"
android:visibility="gone"
android:text="@string/reply"
android:id="@+id/status_peertube_reply"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:drawablePadding="2dp"
android:layout_marginStart="15dp"
android:layout_marginLeft="15dp"
android:visibility="gone"
android:textColor="?colorAccent"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:text="@string/delete"
android:id="@+id/status_peertube_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>/
<LinearLayout
android:layout_marginStart="60dp"
android:layout_marginLeft="60dp"
android:id="@+id/status_action_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_reply"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_height="wrap_content">
<TextView
android:id="@+id/status_mention_spoiler"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_reblog"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_repeat_boost"
app:sparkbutton_inActiveImage="@drawable/ic_repeat"
app:sparkbutton_iconSize="20dp"
android:contentDescription="@string/reblog"
/>
android:id="@+id/status_peertube_container"
android:layout_width="match_parent"
android:visibility="gone"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_reblog_count"
android:textColor="?colorAccent"
android:visibility="gone"
android:text="@string/reply"
android:id="@+id/status_peertube_reply"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:drawablePadding="2dp"
android:layout_marginStart="15dp"
android:layout_marginLeft="15dp"
android:visibility="gone"
android:textColor="?colorAccent"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:text="@string/delete"
android:id="@+id/status_peertube_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_fav"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_star"
app:sparkbutton_inActiveImage="@drawable/ic_star_border"
android:contentDescription="@string/favourite"
app:sparkbutton_iconSize="20dp"
/>
android:id="@+id/status_action_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_favorite_count"
android:id="@+id/status_reply"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:id="@+id/status_pin"
android:layout_gravity="center_vertical"
android:contentDescription="@string/pin_add"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_pin_drop"/>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_gravity="end"
android:gravity="end"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_privacy"
<LinearLayout
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
android:layout_width="25dp"
android:layout_height="25dp"
android:contentDescription="@string/toot_visibility_tilte"/>
android:orientation="horizontal"
android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_reblog"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_repeat_boost"
app:sparkbutton_inActiveImage="@drawable/ic_repeat"
app:sparkbutton_iconSize="20dp"
android:contentDescription="@string/reblog"
/>
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_reblog_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:layout_height="wrap_content">
<com.varunest.sparkbutton.SparkButton
android:id="@+id/spark_button_fav"
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_star"
app:sparkbutton_inActiveImage="@drawable/ic_star_border"
android:contentDescription="@string/favourite"
app:sparkbutton_iconSize="20dp"
/>
<TextView
android:drawablePadding="2dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:id="@+id/status_favorite_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:id="@+id/status_more"
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/ic_more_horiz"
android:contentDescription="@string/display_toot_truncate" />
android:id="@+id/status_pin"
android:layout_gravity="center_vertical"
android:contentDescription="@string/pin_add"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_pin_drop"/>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_gravity="end"
android:gravity="end"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/status_privacy"
android:layout_gravity="center_vertical"
android:layout_width="25dp"
android:layout_height="25dp"
android:contentDescription="@string/toot_visibility_tilte"/>
<ImageView
android:layout_marginLeft="15dp"
android:layout_marginStart="15dp"
android:id="@+id/status_more"
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/ic_more_horiz"
android:contentDescription="@string/display_toot_truncate" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/fetch_more"
android:visibility="gone"

View File

@ -129,12 +129,6 @@
android:contentDescription="@string/profile_picture" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:visibility="gone"
android:id="@+id/vertical_content"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/left_buttons"
android:orientation="vertical"

View File

@ -81,12 +81,7 @@
android:layout_height="wrap_content"
android:contentDescription="@string/profile_picture" />
</LinearLayout>
<LinearLayout
android:visibility="gone"
android:id="@+id/vertical_content"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/left_buttons"
android:orientation="vertical"

View File

@ -33,6 +33,10 @@
android:id="@+id/action_import_data"
android:title="@string/import_data"
app:showAsAction="never" />
<item
android:id="@+id/action_logout_account"
android:title="@string/action_logout_account"
app:showAsAction="never" />
<item
android:id="@+id/action_logout"
android:title="@string/action_logout"

View File

@ -654,13 +654,12 @@ https://yandex.ru/legal/confidential/?lang=en </string>
<item>1 día</item>
<item>1 semana</item>
</string-array>
<string name="showcase_instance"> In this field, you need to write your instance host name.\nFor example, if you created your account on https://mastodon.social\nJust write <b>mastodon.social</b> (without https://)\n
You can start writing first letters and names will be suggested.\n\n
⚠ The Login button will only work if the instance name is valid and the instance is up!
<string name="showcase_instance">En este campo, debe escribir el nombre de host de su instancia. \ Npor ejemplo, si creó su cuenta en https: //mastodon.social \ nSólo escriba <b> mastodon.social </b> (sin https: //) \norte
         Puede comenzar a escribir las primeras letras y se sugerirán los nombres. \ N \ n
         ⚠ El botón Iniciar sesión solo funcionará si el nombre de la instancia es válido y la instancia está activa! </string>
<string name="showcase_uid"> En este campo, escriba el correo electrónico que está conectado a tu cuenta de Mastodon.
</string>
<string name="showcase_uid"> In this field, write the email that is attached to your Mastodon account.
</string>
<string name="showcase_pwd"> Last step is to enter your password and click on Login.
<string name="showcase_pwd"> Último paso es introducir su contraseña y haga clic en Inicio de sesión.
</string>
<string name="more_information">Más información</string>
<string name="showcase_2FA">Si utilizas 2FA (autenticación de dos factores), es necesario utilizar este enlace. \nTu también puedes utilizarlo si no deseas ingresar tus credenciales aquí.</string>
@ -723,7 +722,7 @@ https://yandex.ru/legal/confidential/?lang=en </string>
<string name="leave_a_comment">Dejar un comentario</string>
<string name="share">Compartir</string>
<string name="my_pictures">Mis imágenes</string>
<string name="choose_schedule">Choose a schedule mode</string>
<string name="choose_schedule">Elija un modo de programación</string>
<string name="device_schedule">Desde dispositivo</string>
<string name="server_schedule">Desde servidor</string>
<string name="toots_server">Toots (Servidor)</string>
@ -735,7 +734,7 @@ https://yandex.ru/legal/confidential/?lang=en </string>
<string name="settings_category_label_notification">Servicio de notificaciones</string>
<string name="settings_category_label_interface">Interfaz</string>
<string name="settings_category_label_hiddencontent">Contenido oculto</string>
<string name="settings_category_label_composing">Composing</string>
<string name="settings_category_label_composing">Composición</string>
<string name="contact">Contactos</string>
<string name="peertube_comment_on_video"><![CDATA[<b>%1$s</b> commented your video <b>%2$s</b>]]></string>
<string name="peertube_follow_channel"><![CDATA[<b>%1$s</b> is following your channel <b>%2$s</b>]]></string>
@ -743,9 +742,9 @@ https://yandex.ru/legal/confidential/?lang=en </string>
<string name="peertube_video_published"><![CDATA[Your video <b>%1$s</b> has been published]]></string>
<string name="peertube_video_import_success"><![CDATA[Your video import <b>%1$s</b> succeeded]]></string>
<string name="peertube_video_import_error"><![CDATA[Your video import <b>%1$s</b> failed]]></string>
<string name="peertube_video_from_subscription"><![CDATA[<b>%1$s</b> published a new video: <b>%2$s</b>]]></string>
<string name="peertube_video_blacklist"><![CDATA[Your video <b>%1$s</b> has been blacklisted]]></string>
<string name="peertube_video_unblacklist"><![CDATA[Your video <b>%1$s</b> has been unblacklisted]]></string>
<string name="peertube_video_from_subscription"><![CDATA[<b>%1$s</b> publicó un nuevo video: <b>%2$s</b>]]></string>
<string name="peertube_video_blacklist"><![CDATA[Su video <b>%1$s</b> esta en lista negra]]></string>
<string name="peertube_video_unblacklist"><![CDATA[Su video <b>%1$s</b> ha sido unblacklisted]]></string>
<string name="export_data">Exportar datos</string>
<string name="import_data">Importar Datos</string>
<string name="toot_select_import">Selecciona el archivo para importar</string>
@ -754,7 +753,7 @@ https://yandex.ru/legal/confidential/?lang=en </string>
<string name="add_public_comment">Agrega un comentario público</string>
<string name="send_comment">Enviar comentario</string>
<string name="toast_toot_saved_error">No hay conexión a internet. Su mensaje ha sido almacenado en borradores.</string>
<string name="action_plain_text">Plain text</string>
<string name="action_plain_text">Texto plano</string>
<string name="action_html">HTML</string>
<string name="action_markdown">Markdown</string>
<!-- end languages -->

View File

@ -482,9 +482,9 @@
<string name="data_export_toots">Esportatu %1$s(e)ren mezuak</string>
<string name="data_export_success">%1$s toot esportatu dira %2$stik.</string>
<string name="data_export_error">Zerbait ez da behar bezala joan %1$s(e)ko datuak esportatzean</string>
<string name="data_export_error_simple">Something went wrong when exporting data!</string>
<string name="data_import_success_simple">Data have been imported!</string>
<string name="data_import_error_simple">Something went wrong when importing data!</string>
<string name="data_export_error_simple">Zerbait ez da behar bezala joan datuak esportatzean!</string>
<string name="data_import_success_simple">Datuak inportatu dira!</string>
<string name="data_import_error_simple">Zerbait ez da behar bezala joan datuak inportatzean!</string>
<!-- Proxy -->
<string name="proxy_set">Proxya</string>
<string name="proxy_type">Mota</string>
@ -726,20 +726,20 @@
<string name="leave_a_comment">Egin iruzkin bat</string>
<string name="share">Partekatu</string>
<string name="my_pictures">Nire irudiak</string>
<string name="choose_schedule">Choose a schedule mode</string>
<string name="device_schedule">From device</string>
<string name="server_schedule">From server</string>
<string name="toots_server">Toots (Server)</string>
<string name="toots_client">Toots (Device)</string>
<string name="modify">Modify</string>
<string name="choose_schedule">Hautatu programazio modua</string>
<string name="device_schedule">Gailutik</string>
<string name="server_schedule">Zerbitzaritik</string>
<string name="toots_server">Tootak (zerbitzaria)</string>
<string name="toots_client">Tootak (gailua)</string>
<string name="modify">Aldatu</string>
<string name="set_display_content_after_fetch_more">Display new toots above the \"Fetch more\" button</string>
<string name="settings_category_label_confirmations">Confirmations</string>
<string name="settings_category_label_timelines">Timelines</string>
<string name="settings_category_label_notification">Notification service</string>
<string name="settings_category_label_interface">Interface</string>
<string name="settings_category_label_hiddencontent">Hidden content</string>
<string name="settings_category_label_confirmations">Berrespenak</string>
<string name="settings_category_label_timelines">Denbora-lerroak</string>
<string name="settings_category_label_notification">Jakinarazpen zerbitzua</string>
<string name="settings_category_label_interface">Interfazea</string>
<string name="settings_category_label_hiddencontent">Eduki ezkutua</string>
<string name="settings_category_label_composing">Composing</string>
<string name="contact">Contacts</string>
<string name="contact">Kontaktuak</string>
<string name="peertube_comment_on_video"><![CDATA[<b>%1$s</b> commented your video <b>%2$s</b>]]></string>
<string name="peertube_follow_channel"><![CDATA[<b>%1$s</b> is following your channel <b>%2$s</b>]]></string>
<string name="peertube_follow_account"><![CDATA[<b>%1$s</b> is following your account]]></string>
@ -749,13 +749,13 @@
<string name="peertube_video_from_subscription"><![CDATA[<b>%1$s</b> published a new video: <b>%2$s</b>]]></string>
<string name="peertube_video_blacklist"><![CDATA[Your video <b>%1$s</b> has been blacklisted]]></string>
<string name="peertube_video_unblacklist"><![CDATA[Your video <b>%1$s</b> has been unblacklisted]]></string>
<string name="export_data">Export data</string>
<string name="import_data">Import Data</string>
<string name="toot_select_import">Select the file to import</string>
<string name="export_data">Esportatu datuak</string>
<string name="import_data">Inportatu datuak</string>
<string name="toot_select_import">Hautatu inportatu beharreko fitxategia</string>
<string name="toot_select_file_error">An error occurred when selecting the backup file!</string>
<string name="data_import_start">Please, don\'t kill the app while processing. That can\'t be quite long.</string>
<string name="add_public_comment">Add a public comment</string>
<string name="send_comment">Send comment</string>
<string name="send_comment">Bidali iruzkina</string>
<string name="toast_toot_saved_error">There is no Internet connection. Your message has been stored in drafts.</string>
<string name="action_plain_text">Plain text</string>
<string name="action_html">HTML</string>

View File

@ -866,6 +866,7 @@
<string name="action_plain_text">Plain text</string>
<string name="action_html">HTML</string>
<string name="action_markdown">Markdown</string>
<string name="action_logout_account">Logout account</string>
<!-- end languages -->