diff --git a/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java b/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java index fb5f85525..c7b9c58a0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java +++ b/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java @@ -9,6 +9,7 @@ import android.util.Log; import org.joinmastodon.android.api.ObjectValidationException; import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; +import org.joinmastodon.android.fragments.ComposeFragment; import org.joinmastodon.android.fragments.HomeFragment; import org.joinmastodon.android.fragments.ProfileFragment; import org.joinmastodon.android.fragments.SplashFragment; @@ -56,6 +57,8 @@ public class MainActivity extends FragmentStackActivity{ if(intent.getBooleanExtra("fromNotification", false) && intent.hasExtra("notification")){ Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification")); showFragmentForNotification(notification, session.getID()); + }else if(intent.getBooleanExtra("compose", false)){ + showCompose(); } } } @@ -91,6 +94,8 @@ public class MainActivity extends FragmentStackActivity{ fragment.setArguments(args); showFragmentClearingBackStack(fragment); } + }else if(intent.getBooleanExtra("compose", false)){ + showCompose(); } } @@ -115,4 +120,15 @@ public class MainActivity extends FragmentStackActivity{ fragment.setArguments(args); showFragment(fragment); } + + private void showCompose(){ + AccountSession session=AccountSessionManager.getInstance().getLastActiveAccount(); + if(session==null || !session.activated) + return; + ComposeFragment compose=new ComposeFragment(); + Bundle composeArgs=new Bundle(); + composeArgs.putString("account", session.getID()); + compose.setArguments(composeArgs); + showFragment(compose); + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java index 2c113bcb5..f728649bf 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java @@ -233,6 +233,12 @@ public class CacheController{ }); } + public void deleteStatus(String id){ + runOnDbThread((db)->{ + db.delete("home_timeline", "`id`=?", new String[]{id}); + }); + } + public void clearRecentSearches(){ runOnDbThread((db)->db.delete("recent_searches", null, null)); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java index f3a05f9f6..52c27480f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java @@ -2,15 +2,22 @@ package org.joinmastodon.android.api.session; import android.app.Activity; import android.app.NotificationManager; +import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.ShortcutInfo; +import android.content.pm.ShortcutManager; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Build; import android.util.Log; import com.google.gson.JsonParseException; +import org.joinmastodon.android.BuildConfig; import org.joinmastodon.android.E; +import org.joinmastodon.android.MainActivity; import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.R; import org.joinmastodon.android.api.MastodonAPIController; @@ -85,11 +92,12 @@ public class AccountSessionManager{ domains.add(session.domain.toLowerCase()); sessions.put(session.getID(), session); } - }catch(IOException|JsonParseException x){ + }catch(Exception x){ Log.e(TAG, "Error loading accounts", x); } lastActiveAccountID=prefs.getString("lastActiveAccount", null); MastodonAPIController.runInBackground(()->readInstanceInfo(domains)); + maybeUpdateShortcuts(); } public void addAccount(Instance instance, Token token, Account self, Application app, boolean active){ @@ -102,6 +110,7 @@ public class AccountSessionManager{ if(PushSubscriptionManager.arePushNotificationsAvailable()){ session.getPushSubscriptionManager().registerAccountForPush(null); } + maybeUpdateShortcuts(); } public synchronized void writeAccountsFile(){ @@ -181,6 +190,7 @@ public class AccountSessionManager{ NotificationManager nm=MastodonApp.context.getSystemService(NotificationManager.class); nm.deleteNotificationChannelGroup(id); } + maybeUpdateShortcuts(); } @NonNull @@ -358,7 +368,7 @@ public class AccountSessionManager{ customEmojis.put(domain, groupCustomEmojis(emojis)); instances.put(domain, emojis.instance); instancesLastUpdated.put(domain, emojis.lastUpdated); - }catch(IOException|JsonParseException x){ + }catch(Exception x){ Log.w(TAG, "Error reading instance info file for "+domain, x); } } @@ -395,6 +405,29 @@ public class AccountSessionManager{ writeAccountsFile(); } + private void maybeUpdateShortcuts(){ + if(Build.VERSION.SDK_INT<26) + return; + ShortcutManager sm=MastodonApp.context.getSystemService(ShortcutManager.class); + if((sm.getDynamicShortcuts().isEmpty() || BuildConfig.DEBUG) && !sessions.isEmpty()){ + // There are no shortcuts, but there are accounts. Add a compose shortcut. + ShortcutInfo info=new ShortcutInfo.Builder(MastodonApp.context, "compose") + .setActivity(ComponentName.createRelative(MastodonApp.context, MainActivity.class.getName())) + .setShortLabel(MastodonApp.context.getString(R.string.new_post)) + .setIcon(Icon.createWithResource(MastodonApp.context, R.mipmap.ic_shortcut_compose)) + .setIntent(new Intent(MastodonApp.context, MainActivity.class) + .setAction(Intent.ACTION_MAIN) + .putExtra("compose", true)) + .build(); + sm.setDynamicShortcuts(Collections.singletonList(info)); + }else if(sessions.isEmpty()){ + // There are shortcuts, but no accounts. Disable existing shortcuts. + sm.disableShortcuts(Collections.singletonList("compose"), MastodonApp.context.getString(R.string.err_not_logged_in)); + }else{ + sm.enableShortcuts(Collections.singletonList("compose")); + } + } + private static class SessionsStorageWrapper{ public List accounts; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index 57e8c3e2e..7cc820f98 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -461,9 +461,7 @@ public abstract class BaseStatusListFragment exten HeaderStatusDisplayItem.Holder header=findHolderOfType(itemID, HeaderStatusDisplayItem.Holder.class); if(header!=null) header.rebind(); - for(ImageStatusDisplayItem.Holder photo:(List)findAllHoldersOfType(itemID, ImageStatusDisplayItem.Holder.class)){ - photo.setRevealed(true); - } + updateImagesSpoilerState(status, itemID); } public void onVisibilityIconClick(HeaderStatusDisplayItem.Holder holder){ @@ -472,12 +470,25 @@ public abstract class BaseStatusListFragment exten if(!TextUtils.isEmpty(status.spoilerText)){ TextStatusDisplayItem.Holder text=findHolderOfType(holder.getItemID(), TextStatusDisplayItem.Holder.class); if(text!=null){ - adapter.notifyItemChanged(text.getAbsoluteAdapterPosition()+getMainAdapterOffset()); + adapter.notifyItemChanged(text.getAbsoluteAdapterPosition()); } } holder.rebind(); - for(ImageStatusDisplayItem.Holder photo:(List)findAllHoldersOfType(holder.getItemID(), ImageStatusDisplayItem.Holder.class)){ + updateImagesSpoilerState(status, holder.getItemID()); + } + + protected void updateImagesSpoilerState(Status status, String itemID){ + ArrayList updatedPositions=new ArrayList<>(); + for(ImageStatusDisplayItem.Holder photo:(List)findAllHoldersOfType(itemID, ImageStatusDisplayItem.Holder.class)){ photo.setRevealed(status.spoilerRevealed); + updatedPositions.add(photo.getAbsoluteAdapterPosition()-getMainAdapterOffset()); + } + int i=0; + for(StatusDisplayItem item:displayItems){ + if(itemID.equals(item.parentID) && item instanceof ImageStatusDisplayItem && !updatedPositions.contains(i)){ + adapter.notifyItemChanged(i); + } + i++; } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index b2105f6b5..3ca595a86 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -610,12 +610,12 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr public void onSuccess(Status result){ wm.removeView(sendingOverlay); sendingOverlay=null; - Nav.finish(ComposeFragment.this); E.post(new StatusCreatedEvent(result)); if(replyTo!=null){ replyTo.repliesCount++; E.post(new StatusCountersUpdatedEvent(replyTo)); } + Nav.finish(ComposeFragment.this); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index 4f0907e31..724396c61 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -509,10 +509,17 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); return; } - if(relationship==null) + if(relationship==null && !isOwnProfile) return; inflater.inflate(R.menu.profile, menu); menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getDisplayUsername())); + if(isOwnProfile){ + for(int i=0;i{ return; data.remove(status); preloadedData.remove(status); - HeaderStatusDisplayItem item=findItemOfType(ev.id, HeaderStatusDisplayItem.class); - if(item==null) + int index=-1; + for(int i=0;i{ @Override public void onTabReselected(TabLayout.Tab tab){ - + scrollToTop(); } }); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/ComposeAutocompleteViewController.java b/mastodon/src/main/java/org/joinmastodon/android/ui/ComposeAutocompleteViewController.java index 368672bc2..7ff4ca5b4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/ComposeAutocompleteViewController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/ComposeAutocompleteViewController.java @@ -162,6 +162,7 @@ public class ComposeAutocompleteViewController{ .map(WrappedEmoji::new) .collect(Collectors.toList()); UiUtils.updateList(oldList, emojis, list, emojisAdapter, (e1, e2)->e1.emoji.shortcode.equals(e2.emoji.shortcode)); + imgLoader.updateImages(); } } @@ -186,6 +187,7 @@ public class ComposeAutocompleteViewController{ List oldList=users; users=result.accounts.stream().map(WrappedAccount::new).collect(Collectors.toList()); UiUtils.updateList(oldList, users, list, usersAdapter, (a1, a2)->a1.account.id.equals(a2.account.id)); + imgLoader.updateImages(); if(listIsHidden){ listIsHidden=false; V.setVisibilityAnimated(list, View.VISIBLE); @@ -210,6 +212,7 @@ public class ComposeAutocompleteViewController{ List oldList=hashtags; hashtags=result.hashtags; UiUtils.updateList(oldList, hashtags, list, hashtagsAdapter, (t1, t2)->t1.name.equals(t2.name)); + imgLoader.updateImages(); if(listIsHidden){ listIsHidden=false; V.setVisibilityAnimated(list, View.VISIBLE); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/AudioStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/AudioStatusDisplayItem.java index cb039cb66..89ed42fb7 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/AudioStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/AudioStatusDisplayItem.java @@ -92,7 +92,9 @@ public class AudioStatusDisplayItem extends StatusDisplayItem{ public void onBind(AudioStatusDisplayItem item){ int seconds=(int)item.attachment.getDuration(); String duration=formatDuration(seconds); - time.getLayoutParams().width=(int)Math.ceil(time.getPaint().measureText("-"+duration)); + // Some fonts (not Roboto) have different-width digits. 0 is supposedly the widest. + time.getLayoutParams().width=(int)Math.ceil(Math.max(time.getPaint().measureText("-"+duration), + time.getPaint().measureText("-"+duration.replaceAll("\\d", "0")))); time.setText(duration); AudioPlayerService service=AudioPlayerService.getInstance(); if(service!=null && service.getAttachmentID().equals(item.attachment.id)){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java index 8621e36c3..557bede7e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java @@ -11,6 +11,7 @@ import android.widget.TextView; import org.joinmastodon.android.R; import org.joinmastodon.android.fragments.BaseStatusListFragment; import org.joinmastodon.android.model.Status; +import org.joinmastodon.android.ui.text.HtmlParser; import org.joinmastodon.android.ui.utils.CustomEmojiHelper; import org.joinmastodon.android.ui.views.LinkedTextView; @@ -20,7 +21,8 @@ import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; public class TextStatusDisplayItem extends StatusDisplayItem{ private CharSequence text; - private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); + private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(), spoilerEmojiHelper; + private CharSequence parsedSpoilerText; public boolean textSelectable; public final Status status; @@ -29,6 +31,11 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ this.text=text; this.status=status; emojiHelper.setText(text); + if(!TextUtils.isEmpty(status.spoilerText)){ + parsedSpoilerText=HtmlParser.parseCustomEmoji(status.spoilerText, status.emojis); + spoilerEmojiHelper=new CustomEmojiHelper(); + spoilerEmojiHelper.setText(parsedSpoilerText); + } } @Override @@ -38,11 +45,15 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ @Override public int getImageCount(){ + if(spoilerEmojiHelper!=null && !status.spoilerRevealed) + return spoilerEmojiHelper.getImageCount(); return emojiHelper.getImageCount(); } @Override public ImageLoaderRequest getImageRequest(int index){ + if(spoilerEmojiHelper!=null && !status.spoilerRevealed) + return spoilerEmojiHelper.getImageRequest(index); return emojiHelper.getImageRequest(index); } @@ -65,7 +76,7 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ text.setTextIsSelectable(item.textSelectable); text.setInvalidateOnEveryFrame(false); if(!TextUtils.isEmpty(item.status.spoilerText)){ - spoilerTitle.setText(item.status.spoilerText); + spoilerTitle.setText(item.parsedSpoilerText); if(item.status.spoilerRevealed){ spoilerOverlay.setVisibility(View.GONE); text.setVisibility(View.VISIBLE); @@ -84,8 +95,9 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ @Override public void setImage(int index, Drawable image){ - item.emojiHelper.setImageDrawable(index, image); + getEmojiHelper().setImageDrawable(index, image); text.invalidate(); + spoilerTitle.invalidate(); if(image instanceof Animatable){ ((Animatable) image).start(); if(image instanceof MovieDrawable) @@ -95,8 +107,12 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ @Override public void clearImage(int index){ - item.emojiHelper.setImageDrawable(index, null); + getEmojiHelper().setImageDrawable(index, null); text.invalidate(); } + + private CustomEmojiHelper getEmojiHelper(){ + return item.spoilerEmojiHelper!=null && !item.status.spoilerRevealed ? item.spoilerEmojiHelper : item.emojiHelper; + } } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/text/DeleteWhenCopiedSpan.java b/mastodon/src/main/java/org/joinmastodon/android/ui/text/DeleteWhenCopiedSpan.java new file mode 100644 index 000000000..02f40c2df --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/text/DeleteWhenCopiedSpan.java @@ -0,0 +1,8 @@ +package org.joinmastodon.android.ui.text; + +/** + * A span to mark character ranges that should be deleted when copied to the clipboard. + * Works with {@link org.joinmastodon.android.ui.views.LinkedTextView}. + */ +public class DeleteWhenCopiedSpan{ +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java b/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java index ff8a47df1..ec3757dd5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java @@ -67,10 +67,9 @@ public class HtmlParser{ @Override public void head(@NonNull Node node, int depth){ - if(node instanceof TextNode){ - ssb.append(((TextNode) node).text()); - }else if(node instanceof Element){ - Element el=(Element)node; + if(node instanceof TextNode textNode){ + ssb.append(textNode.text()); + }else if(node instanceof Element el){ switch(el.nodeName()){ case "a" -> { String href=el.attr("href"); @@ -108,10 +107,9 @@ public class HtmlParser{ @Override public void tail(@NonNull Node node, int depth){ - if(node instanceof Element){ - Element el=(Element)node; + if(node instanceof Element el){ if("span".equals(el.nodeName()) && el.hasClass("ellipsis")){ - ssb.append('…'); + ssb.append("…", new DeleteWhenCopiedSpan(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); }else if("p".equals(el.nodeName())){ if(node.nextSibling()!=null) ssb.append("\n\n"); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index a689ae93e..e40a4a7eb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -107,7 +107,9 @@ public class UiUtils{ long t=instant.toEpochMilli(); long now=System.currentTimeMillis(); long diff=now-t; - if(diff<60_000L){ + if(diff<1000L){ + return context.getString(R.string.time_now); + }else if(diff<60_000L){ return context.getString(R.string.time_seconds, diff/1000L); }else if(diff<3600_000L){ return context.getString(R.string.time_minutes, diff/60_000L); @@ -336,6 +338,7 @@ public class UiUtils{ @Override public void onSuccess(Status result){ resultCallback.accept(result); + AccountSessionManager.getInstance().getAccount(accountID).getCacheController().deleteStatus(status.id); E.post(new StatusDeletedEvent(status.id, accountID)); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/views/ImageAttachmentFrameLayout.java b/mastodon/src/main/java/org/joinmastodon/android/ui/views/ImageAttachmentFrameLayout.java index dff3aa247..0bfcbdb16 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/views/ImageAttachmentFrameLayout.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/views/ImageAttachmentFrameLayout.java @@ -36,7 +36,7 @@ public class ImageAttachmentFrameLayout extends FrameLayout{ super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; } - int w=Math.min(((View)getParent()).getMeasuredWidth()-horizontalInset, V.dp(MAX_WIDTH)); + int w=Math.min(((View)getParent()).getMeasuredWidth(), V.dp(MAX_WIDTH))-horizontalInset; int actualHeight=Math.round(tile.height/1000f*w)+V.dp(1)*(tile.rowSpan-1); int actualWidth=Math.round(tile.width/1000f*w); if(tile.startCol+tile.colSpan0){ + SpannableStringBuilder ssb=new SpannableStringBuilder(spanned); + for(DeleteWhenCopiedSpan span:delSpans){ + int start=ssb.getSpanStart(span); + int end=ssb.getSpanStart(span); + if(start==-1) + continue; + ssb.delete(start, end+1); + } + return ssb; + } + } + return text; + } } diff --git a/mastodon/src/main/res/drawable/ic_compose_foreground.xml b/mastodon/src/main/res/drawable/ic_compose_foreground.xml new file mode 100644 index 000000000..53a8ae5e0 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_compose_foreground.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/mastodon/src/main/res/layout/display_item_audio.xml b/mastodon/src/main/res/layout/display_item_audio.xml index 11e370b96..43053a693 100644 --- a/mastodon/src/main/res/layout/display_item_audio.xml +++ b/mastodon/src/main/res/layout/display_item_audio.xml @@ -46,6 +46,7 @@ android:textAppearance="@style/m3_label_medium" android:textColor="?colorButtonText" android:gravity="end" + android:singleLine="true" tools:text="1:23"/> diff --git a/mastodon/src/main/res/layout/item_discover_account.xml b/mastodon/src/main/res/layout/item_discover_account.xml index ba98da6ff..b702da02a 100644 --- a/mastodon/src/main/res/layout/item_discover_account.xml +++ b/mastodon/src/main/res/layout/item_discover_account.xml @@ -78,102 +78,110 @@ tools:text="Founder, CEO and lead developer @Mastodon, Germany." /> - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + android:layout_marginTop="8dp" + android:padding="8dp" + android:layout_marginEnd="8dp" + android:clipToPadding="false"> + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/mipmap-anydpi-v26/ic_shortcut_compose.xml b/mastodon/src/main/res/mipmap-anydpi-v26/ic_shortcut_compose.xml new file mode 100644 index 000000000..3d2eb2be3 --- /dev/null +++ b/mastodon/src/main/res/mipmap-anydpi-v26/ic_shortcut_compose.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/values-night/colors.xml b/mastodon/src/main/res/values-night/colors.xml new file mode 100644 index 000000000..4f6465484 --- /dev/null +++ b/mastodon/src/main/res/values-night/colors.xml @@ -0,0 +1,5 @@ + + + @color/gray_700 + @color/primary_600 + \ No newline at end of file diff --git a/mastodon/src/main/res/values/colors.xml b/mastodon/src/main/res/values/colors.xml index 4bb1213f5..dac3a6167 100644 --- a/mastodon/src/main/res/values/colors.xml +++ b/mastodon/src/main/res/values/colors.xml @@ -93,4 +93,7 @@ @color/warning_500 @color/primary_500 + + @color/gray_100 + @color/primary_700 \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 4721df14a..813814edf 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ - Mastodon + Mastodon Get started Log in @@ -339,5 +339,5 @@ %,d reblogs %1$s via %2$s - Delete and re-draft + now \ No newline at end of file