From 20b6d15c2efef7ecbcb03023ccc12db5a98af34f Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Thu, 30 Mar 2023 14:37:05 -0300 Subject: [PATCH] feat: add auto-updater to the nightly flavor --- .../android/updater/GithubSelfUpdater.java | 2 +- mastodon/src/nightly/AndroidManifest.xml | 5 + .../updater/GithubSelfUpdaterImpl.java | 369 ++++++++++++++++++ .../updater/SelfUpdateContentProvider.java | 62 +++ .../drawable/ic_fluent_dismiss_20_filled.xml | 3 + ...c_fluent_mail_inbox_dismiss_24_regular.xml | 3 + ...c_fluent_mail_inbox_dismiss_28_regular.xml | 3 + .../drawable/ic_fluent_mention_20_regular.xml | 3 + .../drawable/ic_fluent_open_24_regular.xml | 3 + .../ic_fluent_sign_out_24_regular.xml | 3 + .../ic_fluent_speaker_0_24_regular.xml | 3 + .../ic_fluent_speaker_0_28_regular.xml | 3 + .../ic_fluent_speaker_off_24_regular.xml | 3 + .../ic_fluent_speaker_off_28_regular.xml | 3 + .../drawable/ic_launcher_foreground_debug.xml | 15 + ...c_launcher_foreground_monochrome_debug.xml | 15 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../nightly/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1390 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 2696 bytes .../nightly/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 988 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 1784 bytes .../nightly/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1832 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 3845 bytes .../nightly/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 2899 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 6224 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 3947 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 8724 bytes .../res/values/ic_launcher_background.xml | 4 + 29 files changed, 513 insertions(+), 1 deletion(-) create mode 100644 mastodon/src/nightly/java/org/joinmastodon/android/updater/GithubSelfUpdaterImpl.java create mode 100644 mastodon/src/nightly/java/org/joinmastodon/android/updater/SelfUpdateContentProvider.java create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_dismiss_20_filled.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_mail_inbox_dismiss_24_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_mail_inbox_dismiss_28_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_mention_20_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_open_24_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_sign_out_24_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_speaker_0_24_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_speaker_0_28_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_speaker_off_24_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_fluent_speaker_off_28_regular.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_launcher_foreground_debug.xml create mode 100644 mastodon/src/nightly/res/drawable/ic_launcher_foreground_monochrome_debug.xml create mode 100644 mastodon/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 mastodon/src/nightly/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 mastodon/src/nightly/res/mipmap-hdpi/ic_launcher.png create mode 100644 mastodon/src/nightly/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 mastodon/src/nightly/res/mipmap-mdpi/ic_launcher.png create mode 100644 mastodon/src/nightly/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 mastodon/src/nightly/res/mipmap-xhdpi/ic_launcher.png create mode 100644 mastodon/src/nightly/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 mastodon/src/nightly/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 mastodon/src/nightly/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 mastodon/src/nightly/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 mastodon/src/nightly/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 mastodon/src/nightly/res/values/ic_launcher_background.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/updater/GithubSelfUpdater.java b/mastodon/src/main/java/org/joinmastodon/android/updater/GithubSelfUpdater.java index 90a20e815..27a61cb28 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/updater/GithubSelfUpdater.java +++ b/mastodon/src/main/java/org/joinmastodon/android/updater/GithubSelfUpdater.java @@ -20,7 +20,7 @@ public abstract class GithubSelfUpdater{ } public static boolean needSelfUpdating(){ - return BuildConfig.BUILD_TYPE.equals("githubRelease") || BuildConfig.BUILD_TYPE.equals("debug"); + return BuildConfig.BUILD_TYPE.equals("githubRelease") || BuildConfig.BUILD_TYPE.equals("debug") || BuildConfig.BUILD_TYPE.equals("nightly"); } public abstract void checkForUpdates(); diff --git a/mastodon/src/nightly/AndroidManifest.xml b/mastodon/src/nightly/AndroidManifest.xml index cb2da7db1..539f6cb36 100644 --- a/mastodon/src/nightly/AndroidManifest.xml +++ b/mastodon/src/nightly/AndroidManifest.xml @@ -15,6 +15,11 @@ + \ No newline at end of file diff --git a/mastodon/src/nightly/java/org/joinmastodon/android/updater/GithubSelfUpdaterImpl.java b/mastodon/src/nightly/java/org/joinmastodon/android/updater/GithubSelfUpdaterImpl.java new file mode 100644 index 000000000..76eb2d853 --- /dev/null +++ b/mastodon/src/nightly/java/org/joinmastodon/android/updater/GithubSelfUpdaterImpl.java @@ -0,0 +1,369 @@ +package org.joinmastodon.android.updater; + +import android.app.Activity; +import android.app.DownloadManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.content.pm.PackageInstaller; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.util.Log; +import android.widget.Toast; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import org.joinmastodon.android.BuildConfig; +import org.joinmastodon.android.E; +import org.joinmastodon.android.GlobalUserPreferences; +import org.joinmastodon.android.MastodonApp; +import org.joinmastodon.android.R; +import org.joinmastodon.android.api.MastodonAPIController; +import org.joinmastodon.android.events.SelfUpdateStateChangedEvent; + +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import androidx.annotation.Keep; +import okhttp3.Call; +import okhttp3.Request; +import okhttp3.Response; + +@Keep +public class GithubSelfUpdaterImpl extends GithubSelfUpdater{ + private static final long CHECK_PERIOD=6*3600*1000L; + private static final String TAG="GithubSelfUpdater"; + + private UpdateState state=UpdateState.NO_UPDATE; + private UpdateInfo info; + private long downloadID; + private BroadcastReceiver downloadCompletionReceiver=new BroadcastReceiver(){ + @Override + public void onReceive(Context context, Intent intent){ + if(downloadID!=0 && intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0)==downloadID){ + MastodonApp.context.unregisterReceiver(this); + setState(UpdateState.DOWNLOADED); + } + } + }; + + public GithubSelfUpdaterImpl(){ + SharedPreferences prefs=getPrefs(); + int checkedByBuild=prefs.getInt("checkedByBuild", 0); + if(prefs.contains("version") && checkedByBuild==BuildConfig.VERSION_CODE){ + info=new UpdateInfo(); + info.version=prefs.getString("version", null); + info.size=prefs.getLong("apkSize", 0); + info.changelog=prefs.getString("changelog", null); + downloadID=prefs.getLong("downloadID", 0); + if(downloadID==0 || !getUpdateApkFile().exists()){ + state=UpdateState.UPDATE_AVAILABLE; + }else{ + DownloadManager dm=MastodonApp.context.getSystemService(DownloadManager.class); + state=dm.getUriForDownloadedFile(downloadID)==null ? UpdateState.DOWNLOADING : UpdateState.DOWNLOADED; + if(state==UpdateState.DOWNLOADING){ + MastodonApp.context.registerReceiver(downloadCompletionReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); + } + } + }else if(checkedByBuild!=BuildConfig.VERSION_CODE && checkedByBuild>0){ + // We are in a new version, running for the first time after update. Gotta clean things up. + long id=getPrefs().getLong("downloadID", 0); + if(id!=0){ + MastodonApp.context.getSystemService(DownloadManager.class).remove(id); + } + getUpdateApkFile().delete(); + getPrefs().edit() + .remove("apkSize") + .remove("version") + .remove("apkURL") + .remove("checkedByBuild") + .remove("downloadID") + .remove("changelog") + .apply(); + } + } + + private SharedPreferences getPrefs(){ + return MastodonApp.context.getSharedPreferences("githubUpdater", Context.MODE_PRIVATE); + } + + @Override + public void maybeCheckForUpdates(){ + if(state!=UpdateState.NO_UPDATE && state!=UpdateState.UPDATE_AVAILABLE) + return; + long timeSinceLastCheck=System.currentTimeMillis()-getPrefs().getLong("lastCheck", CHECK_PERIOD); + if(timeSinceLastCheck>=CHECK_PERIOD){ + setState(UpdateState.CHECKING); + MastodonAPIController.runInBackground(this::actuallyCheckForUpdates); + } + } + + @Override + public void checkForUpdates() { + setState(UpdateState.CHECKING); + MastodonAPIController.runInBackground(this::actuallyCheckForUpdates); + } + + private void actuallyCheckForUpdates(){ + Request req=new Request.Builder() + .url("https://api.github.com/repos/LucasGGamerM/moshidon/releases") + .build(); + Call call=MastodonAPIController.getHttpClient().newCall(req); + try(Response resp=call.execute()){ + JsonArray arr=JsonParser.parseReader(resp.body().charStream()).getAsJsonArray(); + for (JsonElement jsonElement : arr) { + JsonObject obj = jsonElement.getAsJsonObject(); + if (obj.get("prerelease").getAsBoolean() && !GlobalUserPreferences.enablePreReleases) continue; + + String tag=obj.get("tag_name").getAsString(); + String changelog=obj.get("body").getAsString(); + Pattern pattern=Pattern.compile("v?(\\d+)\\.(\\d+)\\.(\\d+)\\+fork\\.(\\d+)"); + Matcher matcher=pattern.matcher(tag); + if(!matcher.find()){ + Log.w(TAG, "actuallyCheckForUpdates: release tag has wrong format: "+tag); + return; + } + int newMajor=Integer.parseInt(matcher.group(1)), + newMinor=Integer.parseInt(matcher.group(2)), + newRevision=Integer.parseInt(matcher.group(3)), + newForkNumber=Integer.parseInt(matcher.group(4)); + matcher=pattern.matcher(BuildConfig.VERSION_NAME); + String[] currentParts=BuildConfig.VERSION_NAME.split("[.+]"); + if(!matcher.find()){ + Log.w(TAG, "actuallyCheckForUpdates: current version has wrong format: "+BuildConfig.VERSION_NAME); + return; + } + int curMajor=Integer.parseInt(matcher.group(1)), + curMinor=Integer.parseInt(matcher.group(2)), + curRevision=Integer.parseInt(matcher.group(3)), + curForkNumber=Integer.parseInt(matcher.group(4)); + long newVersion=((long)newMajor << 32) | ((long)newMinor << 16) | newRevision; + long curVersion=((long)curMajor << 32) | ((long)curMinor << 16) | curRevision; + if(newVersion>curVersion || newForkNumber>curForkNumber){ + String version=newMajor+"."+newMinor+"."+newRevision+"+fork."+newForkNumber; + Log.d(TAG, "actuallyCheckForUpdates: new version: "+version); + for(JsonElement el:obj.getAsJsonArray("assets")){ + JsonObject asset=el.getAsJsonObject(); + if("moshidon.apk".equals(asset.get("name").getAsString()) && "application/vnd.android.package-archive".equals(asset.get("content_type").getAsString()) && "uploaded".equals(asset.get("state").getAsString())){ + long size=asset.get("size").getAsLong(); + String url=asset.get("browser_download_url").getAsString(); + + UpdateInfo info=new UpdateInfo(); + info.size=size; + info.version=version; + info.changelog=changelog; + this.info=info; + + getPrefs().edit() + .putLong("apkSize", size) + .putString("version", version) + .putString("apkURL", url) + .putString("changelog", changelog) + .putInt("checkedByBuild", BuildConfig.VERSION_CODE) + .remove("downloadID") + .apply(); + + break; + } + } + } + getPrefs().edit().putLong("lastCheck", System.currentTimeMillis()).apply(); + break; + } + }catch(Exception x){ + Log.w(TAG, "actuallyCheckForUpdates", x); + }finally{ + setState(info==null ? UpdateState.NO_UPDATE : UpdateState.UPDATE_AVAILABLE); + } + } + + private void setState(UpdateState state){ + this.state=state; + E.post(new SelfUpdateStateChangedEvent(state)); + } + + @Override + public UpdateState getState(){ + return state; + } + + @Override + public UpdateInfo getUpdateInfo(){ + return info; + } + + public File getUpdateApkFile(){ + return new File(MastodonApp.context.getExternalCacheDir(), "update.apk"); + } + + @Override + public void downloadUpdate(){ + if(state==UpdateState.DOWNLOADING) + throw new IllegalStateException(); + DownloadManager dm=MastodonApp.context.getSystemService(DownloadManager.class); + MastodonApp.context.registerReceiver(downloadCompletionReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); + downloadID=dm.enqueue( + new DownloadManager.Request(Uri.parse(getPrefs().getString("apkURL", null))) + .setDestinationUri(Uri.fromFile(getUpdateApkFile())) + ); + getPrefs().edit().putLong("downloadID", downloadID).apply(); + setState(UpdateState.DOWNLOADING); + } + + @Override + public void installUpdate(Activity activity){ + if(state!=UpdateState.DOWNLOADED) + throw new IllegalStateException(); + Uri uri; + Intent intent=new Intent(Intent.ACTION_INSTALL_PACKAGE); + if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){ + uri=new Uri.Builder().scheme("content").authority(activity.getPackageName()+".self_update_provider").path("update.apk").build(); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + }else{ + uri=Uri.fromFile(getUpdateApkFile()); + } + intent.setDataAndType(uri, "application/vnd.android.package-archive"); + activity.startActivity(intent); + + // TODO figure out how to restart the app when updating via this new API + /* + PackageInstaller installer=activity.getPackageManager().getPackageInstaller(); + try{ + final int sid=installer.createSession(new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)); + installer.registerSessionCallback(new PackageInstaller.SessionCallback(){ + @Override + public void onCreated(int i){ + + } + + @Override + public void onBadgingChanged(int i){ + + } + + @Override + public void onActiveChanged(int i, boolean b){ + + } + + @Override + public void onProgressChanged(int id, float progress){ + + } + + @Override + public void onFinished(int id, boolean success){ + activity.getPackageManager().setComponentEnabledSetting(new ComponentName(activity, AfterUpdateRestartReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); + } + }); + activity.getPackageManager().setComponentEnabledSetting(new ComponentName(activity, AfterUpdateRestartReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + PackageInstaller.Session session=installer.openSession(sid); + try(OutputStream out=session.openWrite("mastodon.apk", 0, info.size); InputStream in=new FileInputStream(getUpdateApkFile())){ + byte[] buffer=new byte[16384]; + int read; + while((read=in.read(buffer))>0){ + out.write(buffer, 0, read); + } + } +// PendingIntent intent=PendingIntent.getBroadcast(activity, 1, new Intent(activity, InstallerStatusReceiver.class), PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE); + PendingIntent intent=PendingIntent.getActivity(activity, 1, new Intent(activity, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); + session.commit(intent.getIntentSender()); + }catch(IOException x){ + Log.w(TAG, "installUpdate", x); + Toast.makeText(activity, x.getMessage(), Toast.LENGTH_SHORT).show(); + } + */ + } + + @Override + public float getDownloadProgress(){ + if(state!=UpdateState.DOWNLOADING) + throw new IllegalStateException(); + DownloadManager dm=MastodonApp.context.getSystemService(DownloadManager.class); + try(Cursor cursor=dm.query(new DownloadManager.Query().setFilterById(downloadID))){ + if(cursor.moveToFirst()){ + long loaded=cursor.getLong(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); + long total=cursor.getLong(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); +// Log.d(TAG, "getDownloadProgress: "+loaded+" of "+total); + return total>0 ? (float)loaded/total : 0f; + } + } + return 0; + } + + @Override + public void cancelDownload(){ + if(state!=UpdateState.DOWNLOADING) + throw new IllegalStateException(); + DownloadManager dm=MastodonApp.context.getSystemService(DownloadManager.class); + dm.remove(downloadID); + downloadID=0; + getPrefs().edit().remove("downloadID").apply(); + setState(UpdateState.UPDATE_AVAILABLE); + } + + @Override + public void handleIntentFromInstaller(Intent intent, Activity activity){ + int status=intent.getIntExtra(PackageInstaller.EXTRA_STATUS, 0); + if(status==PackageInstaller.STATUS_PENDING_USER_ACTION){ + Intent confirmIntent=intent.getParcelableExtra(Intent.EXTRA_INTENT); + activity.startActivity(confirmIntent); + }else if(status!=PackageInstaller.STATUS_SUCCESS){ + String msg=intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE); + Toast.makeText(activity, activity.getString(R.string.error)+":\n"+msg, Toast.LENGTH_LONG).show(); + } + } + + /*public static class InstallerStatusReceiver extends BroadcastReceiver{ + + @Override + public void onReceive(Context context, Intent intent){ + int status=intent.getIntExtra(PackageInstaller.EXTRA_STATUS, 0); + if(status==PackageInstaller.STATUS_PENDING_USER_ACTION){ + Intent confirmIntent=intent.getParcelableExtra(Intent.EXTRA_INTENT); + context.startActivity(confirmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + }else if(status!=PackageInstaller.STATUS_SUCCESS){ + String msg=intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE); + Toast.makeText(context, context.getString(R.string.error)+":\n"+msg, Toast.LENGTH_LONG).show(); + } + } + } + + public static class AfterUpdateRestartReceiver extends BroadcastReceiver{ + + @Override + public void onReceive(Context context, Intent intent){ + if(Intent.ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction())){ + context.getPackageManager().setComponentEnabledSetting(new ComponentName(context, AfterUpdateRestartReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); + Toast.makeText(context, R.string.update_installed, Toast.LENGTH_SHORT).show(); + Intent restartIntent=new Intent(context, MainActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setPackage(context.getPackageName()); + if(Build.VERSION.SDK_INT + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_mail_inbox_dismiss_24_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_mail_inbox_dismiss_24_regular.xml new file mode 100644 index 000000000..e32e4fab5 --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_mail_inbox_dismiss_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_mail_inbox_dismiss_28_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_mail_inbox_dismiss_28_regular.xml new file mode 100644 index 000000000..2ea945f3d --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_mail_inbox_dismiss_28_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_mention_20_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_mention_20_regular.xml new file mode 100644 index 000000000..77a55c495 --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_mention_20_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_open_24_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_open_24_regular.xml new file mode 100644 index 000000000..e18fe0aed --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_open_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_sign_out_24_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_sign_out_24_regular.xml new file mode 100644 index 000000000..d20ea1330 --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_sign_out_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_speaker_0_24_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_speaker_0_24_regular.xml new file mode 100644 index 000000000..8a35ff41e --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_speaker_0_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_speaker_0_28_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_speaker_0_28_regular.xml new file mode 100644 index 000000000..53c6f5b6a --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_speaker_0_28_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_speaker_off_24_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_speaker_off_24_regular.xml new file mode 100644 index 000000000..e1b6ba1c9 --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_speaker_off_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_fluent_speaker_off_28_regular.xml b/mastodon/src/nightly/res/drawable/ic_fluent_speaker_off_28_regular.xml new file mode 100644 index 000000000..05defaa38 --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_fluent_speaker_off_28_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/nightly/res/drawable/ic_launcher_foreground_debug.xml b/mastodon/src/nightly/res/drawable/ic_launcher_foreground_debug.xml new file mode 100644 index 000000000..d939ad5c7 --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_launcher_foreground_debug.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/mastodon/src/nightly/res/drawable/ic_launcher_foreground_monochrome_debug.xml b/mastodon/src/nightly/res/drawable/ic_launcher_foreground_monochrome_debug.xml new file mode 100644 index 000000000..d939ad5c7 --- /dev/null +++ b/mastodon/src/nightly/res/drawable/ic_launcher_foreground_monochrome_debug.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/mastodon/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml b/mastodon/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..16a3a2677 --- /dev/null +++ b/mastodon/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/mastodon/src/nightly/res/mipmap-anydpi-v26/ic_launcher_round.xml b/mastodon/src/nightly/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..16a3a2677 --- /dev/null +++ b/mastodon/src/nightly/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/mastodon/src/nightly/res/mipmap-hdpi/ic_launcher.png b/mastodon/src/nightly/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e867bc8770ad8b1fd11963f758ba32f5e94ea21a GIT binary patch literal 1390 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2U^Vr0aSW-5dpoDzCp1;!c)Z^C zxQ9&&il34n9gue{b2U+);n%Ts;!Cftty7)suSq%mOwQgGvFvP`eZb+ht(O9BEb-Yg zb>@;MtsWsF68n3CoV6~i#N6Ef_v074_b=yEpSLWzU;S{~VcY8YZ#VBQzW?3k``^0v zpY5K{+0Ce^&~+uS0``iOkAUsSG?uE!v^JS zEtQ}Xvue3^p5E_#<>Z-`HJSW{@k?v@=JYHLcZCSpPu%h=S76ih6_aOjMqXxobnSKV z3H3M1uTs*Su7!9XOAIg#R5uphw9HD0M@lqNfE^cl%)2Qr=19_V-hg(};JIBe% z$+-IJsb>n;0#@gp``@yWZRz=a?5niD9lp>SpZMfb{D

`2kVV`t{)5%*-`WWw~ox9`3U* zEzbM;mvQ}+shcft-C;Z;(X4h;{h)YhuhqqQSKe8kSjDp1%UZ2??`JWc^XD!;l?dv-mI0@+a8B{sNu6T3vYuABq$Mib-y#spphsG`JDWCT$)HL_W*52r;AA{Rt1Z*v(lw<@0KK`oq zD*fxU{r=R=&IWh%WxwxYQ%Lt*mj^N>u#tzS%=u}bQ@iNI=2H7hsMeGh;7 zS~YWp+3=a~a*s%@i>qe(G|iTS+gR*i_xaq0#%uC7W5S)aUEDmbK2sLHyg>Zgv>&Mf zF*!0dUk)ag-ML>Q`EHib>RItYF{gSCx6R*e;=f%^f5zbjS0s%emK-*J^W(2y7#yZ}|Jk=Ou=OUvUUY znUWQgEif-Wx^jZ-|AI6Dp=GM8o~>X0xv-lzb_e5WG5zank8=xORpCCV2li`)$*H(Ss-ZW4~DDH^kjrf9UA?T{oFG7~48eKhEA`s9~AOR?Xw^?EG1l z)mN9ze%!m{hsx8M^jX4AruOv@w#}Jq)gHTdnYvp4FX66!iR1tQMV?0rL?Z!#<|FsB z{2j%S)?Y50 zOfJ=Sk4{hlaM}B$@+7zY+oq?t1WwYJDb~Go&c18GeL+$h?oB)~#_RU}i`Sj$a!JhZ zm|#R1pBGaq-_y7*;}ed&D^%wRIUd`v)r~tRA)@QYe6D4zmMa*y{|mrjPn2h literal 0 HcmV?d00001 diff --git a/mastodon/src/nightly/res/mipmap-hdpi/ic_launcher_round.png b/mastodon/src/nightly/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4e20506d70f59220f1f596a7285d7ca9a58d4837 GIT binary patch literal 2696 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 KMNUMnLSTY^K*(eO literal 0 HcmV?d00001 diff --git a/mastodon/src/nightly/res/mipmap-mdpi/ic_launcher_round.png b/mastodon/src/nightly/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..065ca7d71b34297d19f2906186489e0fc89ca78a GIT binary patch literal 1784 zcmV3(R6h7U7wsfO=OI`s{mavEdYNWo9N-ya zcn2QvLdK?;1cIeEgc+SE*ev){z)=D+kcEzP3XpB1!^q^hd45!IoPr(tPw;Pq0Iw|z zUC?Q20;|zs^L;8R3}ZF>AuKP44~2L#780r{IEhD~}cI!oHO>h21CYyf>}V zE~K8D<}&GI}#S^&{si*6Gw%m#_)CrOhhl}tq4D6qqJWS?&@j4vky-APl> zDwv2Sl4gu&-iL$nX%cDjuY%p0aJT|fo4KEql*Gk_C7hR&$H~dbLGKb16FD!p2N&fR zacXL+NA@aVeA-5V*;l@s4dOZqoGM#gfuRF$F^^+XBd6MP&%nw0OREn#WE&}!k96_;^S-M4)1 zo6COue(Vz0F5AexeSNt4jhdi$z_I${eDjdu9$i-f;&z2ApUvb! zNl~ff^)BVms_M1=@yzs0neFvz{Ak_xK{9h+d0UPDdZ<|f%H+H68p}WL|4n{BtLg+n zG&lXB849RLdXz?X-)eoX^sXXW^L1`im*CwKqCpD$g{IoY`$yB3UZ_)u^IS%emP z%>x)V=qBE`sgZZC-6QQb5Wo;=%RlWsrP4C1d$z}}1v>!KN)`1ay(~792jK!pPDYThr&O_mGb;g<42wjh|2uQ5CTr zKx?oA$js=@cieWT6!B?3efXSOiG3Rzx#j3ZZrplQZH8`n7wjS~AdAuj4K5}R3VIZB z&D;;Up>`k7e4)zoJ`|pKV6x%|(z~Ur_KI3~Z}w8vg*GkUrivGvpj$QsjBhyZHiF?oPgDV0^I=-G=4B^dYnP{@^{1V3OOC(_c=xL8ssKd+#zw6S4)`-t=|to8yt zU?am>8!xe4w|bn26KubpBkgn0QDUgzlEV;o72*iv(`CU((xg_v9H+4x*EvjW9;f2~ z6Wa_xdT-8b__FtwAY-5vLntOJYms267{#uQ!_`IdI@J~+v%}GWlQ48f z)aTnv<{aKtP$;-wFh(4iO1kiHTf&*;jNqIDJYx*+Ryw?6NPk&?4(NhT&-vzB5{#k1 zU>M)*;fPPrPcTeSDH!bl<ly@PHRG=2jI`$K8Y#ffLAEz^o4b{~^->p3N*99>}yi a&;JJ_-bpOC;*#C~0000@@jwp literal 0 HcmV?d00001 diff --git a/mastodon/src/nightly/res/mipmap-xhdpi/ic_launcher.png b/mastodon/src/nightly/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..df1a45557dad7da132b0c06b5d72aaf51d17ea07 GIT binary patch literal 1832 zcma)7X*3&%7LFzjB|(c;P^1jeS{hNys7i>jG&P}B9n+?%eGt3Qj=iC_iPW?u1hFP~ zrIgxQ#J+|hh8DGyMrXzrOSEW5-}3LhbKZB(z4ym=?>YC}bMJSP@%GkGaRqSz006bM z!8#sB;#U&`ANqx?aAN=fyk?8VT#F#AHQSr zpPIyYq6Uu#VY}F%Gs;PYvT|@~RWT5#7?Bh#F83p?h^QrNa-?wD8neFJvB}>je>)Xr zdg}xE_P0~3YnhP(@?JD*OnA_87qyukDqqC>57-XJd#k0%_*5T>*N6mUxz(wPF)u|H zQZwP#zgTm1MPPOU#OoIv^n<@FKa30KUf`0rPiuLkB zb1?T<&tAX~O(Yu*G_VAFCqhObFeXeNjry+yJ=+6KM5|&c*690_i6b-_x#LIU;^OS` zP+@*ys!aq)XHS=qy8^;9_Z@x2ZlsFRRG7GUy`1Ih0`z=sj3Fg~qP619^psym_dpOI zKdC=b-Yc=7^79kZbm`Q{oN+KpW0;a^HSzdnUrJ-e%B$YGr#{_6sEwVUI7^s!6%@L} zY9F9wXL#zNg0?mTOLj{$-u3t2&0k(U)H`7{*dLIz50!^qx539hb(1(NHVE-o09Yq=56Y zu=`+#{Aqhx>Q2FY|C)M{+-E{l|t1I`o{Y^qX#>FnAWcBP}dub}$Y4Zy~FUE=;GBO^7 z99;dGs}Rf|y1`t8f4_BF%sGAkuU^yVYZs?~efu_A*FatNWJ_}=Uh2~CBM`p6&F92d z($41gWwVw(4@3-epef`>^1&gcuc{W|tB|%Z>`v@)GH0nVw{f9eWv^+bi zC{Gd?IB(#;7?E}HPB}2Vy#b|apbjzAo>|=eSbzJZ#q-j##F_}9-j{VZYi{3+7yN8Z z-e}_2vWuKtk%ej1hR}xEX^NisorPsS)5|kJ9vLX>=TZ%=RMyc;t?F6Z5+<3V!N!Wx zva*nX@97>lB(8xfi;Z+=UAxa6({FnX08IcRyi|tG-6A~TCe2?84{~X?F_+g#z(5a| zhV5s-$kuoMWXB)wdG5qVkmEg6sh1*0|fFz%HM+3BaKORiXR2akpD_3RWQyH4{5pgJb z1$S&(uJRI#KJK&9onB$gqEB+y!Zp5&y7);(kR4=d$#cChQEF;#=;k_TK+-gWgq{$d zxJ)dJd-1Y*Pv_(SfGf=x52RfYk3t!U>UyyQ}6phEBhJ#a>a<7*AYOYlH-$OCQ_ViD}I%jo#-0LBB< ju}{uxA^rs)>wVG1@+8NV3@@F-4+yZevd30h5aa&_ldxEl literal 0 HcmV?d00001 diff --git a/mastodon/src/nightly/res/mipmap-xhdpi/ic_launcher_round.png b/mastodon/src/nightly/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d336b3dc95307a4dd4eb5f524292eba973bf382e GIT binary patch literal 3845 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 F_iy1RRI>m8 literal 0 HcmV?d00001 diff --git a/mastodon/src/nightly/res/mipmap-xxhdpi/ic_launcher_round.png b/mastodon/src/nightly/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8aa6fa922025cb5113a728ac511db8eb403b85 GIT binary patch literal 6224 zcmV-W7_aAvP)8oY zprS$C01@0p0mW#7#0~d-oG~+#Oilf6^`Wcp?S8NO(fh0OegBWIQMmEuY1u|8c$W#TQ;mH?5%RUyDTf8LBW5f*%)T4mEr@-I9|Fr-ur}eZQ-(&fp z5A=mT(Kq_&i-x%%Wsq#%1_ON0;u?z;k~E+iSxEv3;$?~jC76HBcp3UgUq?&k4 z@ag}Ju`njarV@y>h7u1|ds#dtnTpR9CTa!hnf$*o#=RviaXkcSLHOnQxxp?Lvn5l> z*}_3BL&L8BH^#iHqy?RX{HO)-iPI#`tv9FSdPMxkfexA^E%BLW5Xtm9d_LRaYe_4y zmcvwQ;g1VxXKrPSVMP* zNm}ZDOT>@amr7bG!Rr(bUuP2}?SbkxFVb1oS{C<-8@TQr#g!9~AN=i_`z_WMCv`W~ z*F>+kxMLLzIE1X?zz=E9S*$Bg>L$6?Uqh3{pTrIHe^UPj6c4J?H!KENlLsvT+*?yTKhoK)Ns`FW2X$q1pVdZD)A&RHc-Me`v&TKPN4>|j9kLTxlr zGLI6MT{LOlNz$DQc~AAjx6z(bArh(EV_L`#Fr5kBr*@#W;*7N>(`5~18oJJu%nk+A z4%BAnN}0V7UWW_z7njk~iEt>a_MkTV(qc1lHZ994HMtKLnkudX!TZ!M)OORw*|g-- zdQF^p5|=VKB+j)9wH>zHQ_2v^U@74IEf)^nr}m*XoFnPzQW8<`Gg{mQgXgIqs4WkW z5_%!^J`ahzSlF(pAE+%KmlAm)Kljm#1`kv}@NG$iDY_R@R{lZUMS}OKKd4QMJ|ok0 zpN%D~`_wbkrra()NSw`!LLyulBsxpn1%mgfU#M-ziL?0{pBaLM8V~ikJ%K>=3$^Vs zi*+Pz|5l6UKD$f$A|ZLMU--7&SDfwFD4E8EK_br5(rDFqpLXrqnO;45nI7GGB)(e{ ztg}uh(|5fMOoxUJiSOD7)W%c9*}m0bOx;&kN#Ea9vE;dvHSA`aZf=e}`~)-Y%G=E& zcg{5n?tjM2zi*Lw)X#<9J$svxJMCe9^UHDOz8fDh zbMIYX7Crd9dF-xv=Am2Wm~&1)-+n*J^y$?nB5k~W9YSsVrnrY;v^tDw_|lcFFm@{oP6}DrfcV}iFSN6G&Gn!b{=IOxOui&_3|f) zwtRfF^m8-&_Q%ZLqkdpIcIcRBtB&y_S%WY}C2+C0#>yVPI&|n@4%%mod40iOB67qH zn+qQ;`@+neI?MFmxG~Wt=-Q>LIs3G8%sVfBn5f$vK6vF*bM^S^Oporx4VzU6wKebb zP#zQ{>bAJUbdh8>S~mP_>~UtfB~RRt`QVdRzcP1CnQ7MTy?%ld4`ddd(TfZpoj@E+1nC^RV&`6)xT-Mpw7Ml$ua;+MJ+WJ2%wv|?_OzZ6HaB&TlHF@sSYh82i zAMQ^WtuD;NaIrW%-j`E}U_pQY>)CfrW54W)dL2M*{acfG!5#I`$`>nBdln&W)D?8~e( zxu+g@)*Q6&7_-p^8=GD|dzBvx`0r1!=#%N^|ImBd2g6)h7L=#p;)ia`eunGYrLKULXQ9SrO}#FylxyM z-20B+KUxOB%gvjy(7gQkt7hS>=gb2)|ItjnY??X#h!Z0M$Lm%IYIBafj*tof+pPFOF9@paP^4K38 z9nmnVon?A-@0qBlV5{ZK6VEcwKm2l{ZZ`1axqRGJW?7W-BPsO^sz$BDcW zX$VBYUyG|;w(tc`Kkm$gQWb=ZlaBg%i;Be~Oqnn>QQyasxyx<-(v+wh$CiV)GE1IV zo~W;28)en7^qAvbLtXbC^v60qfb$_Ji}oQ@@j3a@;t?Jp6>iM$9zArk1x;wqOd zfyVF`pEEI`Pz5W;Y$wF)WdnO=@%lab{isM9H1j1F3b@NCxzmbvy0!{qQWeG(p{`&m;X7?ROChBDa zO9AovK1jCXb+Q3($Hr~EzGCUT*G>P8`)AaFbaU=_B5TrKDBgbI12c5C}3GSepXnOibtg4%wGMK^KWXm%>E zJFnd({aS*WBoNc&czqun--y@Ag+d6l`M|+u#WU|D%7F#W z;`Jco!TTMWs8a^0?N^9%V_ZulWYMnscx^y#--Z?K(=G~V* zio#XA-E0^Cdyns?)S}xt~khd;%yMtIB6L#TVkl~|7Nj^IBqmcAQ;AcpEDr;Et!p! z9JNlMeMj$?bwiiakMTB}L#`R*xL;kAa|@?L@V7H|lRVaflt9}_Akb>$OCT0G>0`Xi z`Db2`XtO!&vcs;4Hnh(bA`p9`c@YTrL?K>Q_Ft0ONXb#_1lqwSxyzsYbD|6zsD&8* zu!D|Bw80wD2}hosC|hEv?MY_{VQ{0_4OJx&FNym`T;(te%acHx4cI)oD2l1JuaR&)EGsf$J>nGk=P#7!{{Ds89;<(Z5 zEKCX1$KrL#Y^3BUCV`5HLI}iX{uVC>$d5QQ#>q#&eNHKI_v_qyp3F+V50-ppzCUvB zM8C=ae=B1{aolM3?hN)hcq)Vce)mA20tm#-ka(eNds={S#`&Vj7hi8Co_|?%kJ-GL z3!_cecv;0YHYeg3Y`kA(fZF~QaeHBKquISMc3LUK`%WJaSGgvSa}*PW5D4&q2JYX_ z=1mF(E882azhR+MEy%)57iIr->QOwS&@ z5^YrgYWq{faUw4Qk!f@KY*#7shAPw4;|@Q;+;!cIthnilTPt$B^TM;oC;Fn8e986E z?LYB4akP_mhNG`+h>|?tc=;_+eLM|`^e<2PmDzsl;gy)G=YqeHx{o+c=wt743STnM z?_$wt@mFz;lr4;LB$OFPR&?nW{i5S_N{!B)x+MFO0*{JmjnUU$d+n$`>s1vFQ@Nlv ze_z}h5S(BUu~`Bk%=0PSS6uc@BV|jZ1F8o8t<9_f5x$yT15#m{#$)ZcwfPFkY%HMd zKy7}LI4;16W~cBf6oPHc`+q8~k+S4K0aXRH`5EH404MSykS5Yh+c+1b?}9H|9u!b< zsI7Tw{YY_KXfc6Sp%BRu(>7jjus|{!4XA&pt$D;p z^Ty^7sG#Y4TyR}v;J7mGR{c;iFBDKeP@8^Yv6DEPlftwre5q&{<2-DmxWtN!guSu) zgWB|Nakhp)tqxx*IvXRA+DP16>_ReKfAEv%gT>jJ?Tc2;zT$!l(lAiSo~zVpT&>GJ*|NY1}{|mh_5_j<26p6eW4MU$aX#liw0TTC+UmE zI}}h`P#ZoX&bI#Hv7!(NA(7&-9(W;kXIWVMPjMFxUZ{4Vw&O`GhlsN+-UnN+QSuxY z^+Ig0vOWM)ZxVO$;Du@z{>%%T627o;QIhAl_$$*emB)Ro64!ySE>wGnY}T$_yN|>@ zJPMn#^S;JY_gtb=dKd~*S?VtP&4&R+gW7DoI9ry~`>1Fx#1{W1;-2REl(>%Q%q*b# z5!uRmpBL=ETZpqIHZ6MY6BmC*#%V>?3=WX=p?YSz z$zpK(_U$hbuX6!ajmSpUW><>4VX#TkXP!&yeN@y7>2rhzh>Uj>p^k0!A97sVxcQ88p=4m zMoi^a5MI_YU%UYXR0K+%MdF_GjBVJ8!d4XvU2%cIy3N62RHL{U%MsYc;sz2H8Osk{ zELmvC<~N4Z&@4cE^fyFn_!!Y z=RLVZ^C4C=*_0#JZea&7+WxyzynzLj6iS|VtnT*`w^c#t!Y0_JD)OFOLdRIqBthdK zel#;nk?2iv0}MG)>7Y5!iWGTt#)U2NenefRMYlTib|Bafi8wN#IS~U5Q~crqT`GB& zT3wG6M;>&K4X{PowknDtN+Pm-4rp&~v1P}O9k;jt&Xe?@!(!u_106;`MoXTjtd57< z&s&PqIl9LNN}j6sJ}Nph)9F1s_Y7#L9U!x_dnK)a5Yk$Y)w;9fx!>xRC(7Y@&^0>u zr|UIC9+fzW_%%d{wH@fN_U+qWCTRr(5)}>&S%0^>yb7I)OPJBIdY+mkkBUzs;xNhF z0C6sMn}&vl6D0G!WFe%rjMaLwlT`D=19$b7Qq`EP0-^x*H{K)t@a2J=3hSt(x{caZyjiz*vi5BadU0#Otldi|j9H zqE!knxJN-D!On!AD1U2pb$Ke6ggE>V(Iq-Xw{=GzUv#mN)li;(#@-nT-`2Qc8`2K4 zpV_xj#S!P*GLaa&pC~_Lb#!nlWZ`+x9Xdpp=oH=7P1wpMkVsE7a+H#UuSwjm2_kK0 ze_e(YPHb2k##_C`?xsK;`*w;c==uDI4Hbov4KQF@lvP;a`MU$kx z(YDrQ^Du`8tulG-kSe;~LR&mk{mtT!cI;!acpY?vuFzRs=R5g|dLxb)uy(;rf?pW% zeH(xhtulXNKR;|0tM}vsb@jCv-n8$le+Z1tVvZf_Q7Pg?;}@q3bb@Zs5xQ!VUMH8t zy%A@1iSJBJaoM=7)wrwqTu)o|RtRb$q2H}bN z`kGE3z7b1BD&MCi^I84n0af%>5kx(ki#jSJBg~XEmA6B$|uY`fNx1r$&)^KN7@Yb36){ragzh6tz z$i)I}bB+02)8ZGl5BsD%4Sn*x4SlBXjDfK*rr>c(C_a(M2Uxae5sjG%E}w*(yDgPW z>X}v(%3^1h1*~CDx0qmYi!C=>+*A0Mi+jm1$@wSZUbOdR3Vh~oe77=HmO8U(!{Sof zq;1ZDr>+$d#`82v8v00I=`(#NIc6-3DG;X&qC_I0WJaQ12}3BEHW9b$&%z|@C;F?$ zL&Zr2@DL*~KF4n@_O)c#-{Qa&_UCV@?;yyI7Q?;zK3P^@D|KzX3zRh{<2rZFCHUu#FH70l8TU`9zs2q@40-e{?4zHYD3AQ2iUn5*W}vt zfxh^piF=zsoC-@WG7%bBcw^<3XKZp2LJP*nV?YEz$N~C)zM~9f zsY6}bpe@>@ZLYz!xF*-84}ml_BtDr44H%6uL2}AM9BV3g0`ey%79N7og7Hac@fwi9 z2Y=%`%21X%N)+0nP1@!fT#IXRZ9hB(($t{%gz`zH#KJRRaJ&S@2Y8Ka(C;Zr9qKAk ue6j?>)VZi}9? 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 JRO)%6{|}BjBu4-M literal 0 HcmV?d00001 diff --git a/mastodon/src/nightly/res/mipmap-xxxhdpi/ic_launcher_round.png b/mastodon/src/nightly/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..e0709f895c6643d11b795db3570141985275e13d GIT binary patch literal 8724 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 + + #000000 + \ No newline at end of file