From a384128c8f6d1f2e9c2c9b8e11ed27e46cba2748 Mon Sep 17 00:00:00 2001 From: opyale Date: Wed, 31 Mar 2021 19:36:11 +0200 Subject: [PATCH 1/4] Launch Toasts on UI thread. (#868) Launch Toasts on UI thread. Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/868 Reviewed-by: M M Arif Co-Authored-By: opyale Co-Committed-By: opyale --- .../org/mian/gitnex/activities/FileDiffActivity.java | 10 +++++----- .../org/mian/gitnex/activities/FileViewActivity.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/mian/gitnex/activities/FileDiffActivity.java b/app/src/main/java/org/mian/gitnex/activities/FileDiffActivity.java index a186dc06..f5966bc8 100644 --- a/app/src/main/java/org/mian/gitnex/activities/FileDiffActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/FileDiffActivity.java @@ -106,23 +106,23 @@ public class FileDiffActivity extends BaseActivity { break; case 401: - AlertDialogs.authorizationTokenRevokedDialog(ctx, + runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx, getString(R.string.alertDialogTokenRevokedTitle), getString(R.string.alertDialogTokenRevokedMessage), getString(R.string.alertDialogTokenRevokedCopyNegativeButton), - getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + getString(R.string.alertDialogTokenRevokedCopyPositiveButton))); break; case 403: - Toasty.error(ctx, ctx.getString(R.string.authorizeError)); + runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError))); break; case 404: - Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)); + runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound))); break; default: - Toasty.error(ctx, getString(R.string.labelGeneralError)); + runOnUiThread(() -> Toasty.error(ctx, getString(R.string.labelGeneralError))); } } catch(IOException ignored) {} diff --git a/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java b/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java index 02a7d140..229ab3c8 100644 --- a/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java @@ -240,23 +240,23 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie switch(response.code()) { case 401: - AlertDialogs.authorizationTokenRevokedDialog(ctx, + runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), - getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton))); break; case 403: - Toasty.error(ctx, ctx.getString(R.string.authorizeError)); + runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError))); break; case 404: - Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)); + runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound))); break; default: - Toasty.error(ctx, getString(R.string.labelGeneralError)); + runOnUiThread(() -> Toasty.error(ctx, getString(R.string.labelGeneralError))); } } From bd3e6ff20a93dda2d2f85e3dc6171f9b9df11c87 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Thu, 1 Apr 2021 12:02:35 +0200 Subject: [PATCH 2/4] [Frontport] Tr updates (#871) Tr updates Co-authored-by: M M Arif Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/871 Reviewed-by: 6543 <6543@noreply.codeberg.org> Co-Authored-By: M M Arif Co-Committed-By: M M Arif --- app/src/main/res/values-it/strings.xml | 54 +++++++++++++------------- app/src/main/res/values-zh/strings.xml | 24 ++++++------ 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index be22cfcb..759066f6 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -37,8 +37,8 @@ Nuovo File Esplora Amministrazione Gitea - Manage Accounts - New Pull Request + Gestione Account + Nuova Pull Request Demo repo Repo con ORG @@ -64,10 +64,10 @@ Apri panello Navigazione Chiudi panello Navigazione Accedi a Gitea - Protocol + Protocollo 1- Scegli il protocollo corretto(https or http). \n2- Enter Gitea url e.g: try.gitea.io. \n3- If you have enabled 2FA for your account, enter the code in the OTP Code field. \n4- For HTTP basic auth use USERNAME@DOMAIN.COM in the URL field. - Couldn\'t connect to host. Please check your URL or port for any errors - It is not recommended to use HTTP protocol unless you are testing on local network + Impossibile connettersi all\'host. Controlla l\'URL o la porta per eventuali errori + Non si consiglia di utilizzare il protocollo HTTP a meno che non si stia testando sulla rete locale Malformed JSON was received. Server response was not successful Istanza URL è richiesto @@ -107,8 +107,8 @@ URL è richiesto File Milestones Rilasci - Branches - Labels + Rami + Etichette Collaboratori Pull Requests Nessun problema trovato @@ -209,13 +209,13 @@ URL è richiesto Bozze dei commenti Abilita Eliminazione Bozze Elimina la bozza del commento quando viene pubblicato - General + Generale Home screen, default link handler Default Link Handler Choose what screen should be loaded if the app cannot handle external links. It will redirect you automatically. N/A Select Default Link Handler Screen - Biometric Support + Sblocco biometrico Nessun altro dato disponibile Nuovo label @@ -287,7 +287,7 @@ autorizzazione Commento aggiornato Condividi Commento Commento eliminato con successo - Copy Comment + Copia commento Aggiungi/Rimuovi collaboratore @@ -305,7 +305,7 @@ autorizzazione Salva Indirizzo Email New email added successfully - Email address is empty + L\'indirizzo email è vuoto Indirizzo email non valido Indirizzo email già in uso Primario @@ -331,8 +331,8 @@ autorizzazione Amministratore Cron Tasks Schedule - Next Run - Last Run + Prossima esecuzione + Ultima esecuzione Executions Task %1$s is initiated successfully @@ -429,7 +429,7 @@ autorizzazione Apri Chiuso Al momento non possiamo raggiungere il server, controlla lo stato del tuo server e riprova - Copy URL + Copia l\'URL Esplora i repository Repository star @@ -479,9 +479,9 @@ autorizzazione Attendere che il file venga caricato in memoria File salvato con successo This file type/size is not supported in file viewer. You can download it from the menu. - Delete This File + Elimina questo file Edit This File - Delete %1$s + Elimina %1$s File is set for deletion by branch %1$s Edit %1$s File is modified by branch %1$s @@ -555,21 +555,21 @@ autorizzazione Fissa Notifica Successfully marked all notifications as read Polling delay, light, vibration - Enable Notifications + Abilita le notifiche Enable Light - Enable Vibration - Choose Color - New messages + Abilita la vibrazione + Scegli il colore + Nuovi messaggi You\'ve got %d new notifications. - Notifications + Notifiche This is the main notification channel of GitNex. Letto Non letto - Repository Settings - Edit Properties - Delete Repository + Impostazioni del repository + Modifica le proprietà + Elimina repository Be careful, this operation CANNOT be undone! - Set as Template + Usa come modello Enable Issues External Issue Tracker Url Enable Wiki @@ -613,8 +613,8 @@ autorizzazione White on Black Grey on Black White on Grey - Dark on White - Biometric Authentication + Nero su bianco + Autenticazione biometrica Unlock using your biometric credentials No biometric features available on this device Biometric features are currently unavailable diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 6b7d3df3..50b34cf4 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -476,7 +476,7 @@ 下载此文件 请等待文件加载到内存 文件保存成功 - This file type/size is not supported in file viewer. You can download it from the menu. + 文件查看器不支持此文件类型/大小。你可以从菜单下载。 删除此文件 编辑此文件 删除 %1$s @@ -527,7 +527,7 @@ 草稿已自动保存。 主题、字体、徽章 PDF 模式,源代码主题 - Biometric authentication, SSL certificates, cache + 生物特征认证、SSL证书、缓存 语言 崩溃报告 如果你喜欢GitNex,你可以给它点赞 @@ -559,8 +559,8 @@ 选择颜色 新消息 您有%d条新通知 - Notifications - This is the main notification channel of GitNex. + 通知 + 这是 GitNex 的主通知通道。 已读 未读 存储库设置 @@ -619,12 +619,12 @@ 从手机设置中注册生物识别 登录 ID \'%s\' 已复制到剪贴板 - Download in progress - Downloading %s - Download successful - Downloaded %s - Download failed - Couldn\'t download %s - Download manager - Indicates the progress of ongoing downloads + 正在下载 + 正在下载 %s + 下载成功 + 已下载 %s + 下载失败 + 无法下载 %s + 下载管理器 + 显示当前下载的进度 From 8104889bf670474dd138dbb46bee5c41b1c4e202 Mon Sep 17 00:00:00 2001 From: opyale Date: Sat, 10 Apr 2021 19:54:05 +0200 Subject: [PATCH 3/4] Improve markdown rendering performance (#890) Use object pooling with up to 45 threads for improved parallelization in markdown rendering. Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/890 Reviewed-by: M M Arif Co-Authored-By: opyale Co-Committed-By: opyale --- README.md | 1 + app/build.gradle | 1 + .../gitnex/activities/FileViewActivity.java | 2 +- .../activities/IssueDetailActivity.java | 2 +- .../mian/gitnex/adapters/DraftsAdapter.java | 2 +- .../gitnex/adapters/IssueCommentsAdapter.java | 4 +- .../gitnex/adapters/MilestonesAdapter.java | 4 +- .../mian/gitnex/adapters/ReleasesAdapter.java | 2 +- .../gitnex/fragments/RepoInfoFragment.java | 2 +- .../org/mian/gitnex/helpers/Markdown.java | 122 +++++++++++++++--- .../{ => views}/SyntaxHighlightedArea.java | 4 +- .../main/res/layout/activity_file_view.xml | 2 +- 12 files changed, 120 insertions(+), 28 deletions(-) rename app/src/main/java/org/mian/gitnex/helpers/{ => views}/SyntaxHighlightedArea.java (98%) diff --git a/README.md b/README.md index f3e3c340..22aae543 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ Thanks to all the open source libraries, contributors and donators. - [ge0rg/MemorizingTrustManager](https://github.com/ge0rg/MemorizingTrustManager) - [mikaelhg/urlbuilder](https://github.com/mikaelhg/urlbuilder) - [ACRA/acra](https://github.com/ACRA/acra) +- [chrisvest/stormpot](https://github.com/chrisvest/stormpot) #### Icon sets - [feathericons/feather](https://github.com/feathericons/feather) diff --git a/app/build.gradle b/app/build.gradle index ac7dbf5d..103c84b0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -112,5 +112,6 @@ dependencies { implementation "org.codeberg.gitnex:tea4j:1.0.5" coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5" implementation 'androidx.biometric:biometric:1.1.0' + implementation 'com.github.chrisvest:stormpot:2.4.1' } diff --git a/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java b/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java index 229ab3c8..80fa8cb0 100644 --- a/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java @@ -305,7 +305,7 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie if(!tinyDB.getBoolean("enableMarkdownInFileView")) { - new Markdown(ctx, EmojiParser.parseToUnicode(binding.contents.getContent()), binding.markdown); + Markdown.render(ctx, EmojiParser.parseToUnicode(binding.contents.getContent()), binding.markdown); binding.contents.setVisibility(View.GONE); binding.markdownFrame.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index 6a18e9a0..3760ab8a 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -582,7 +582,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt viewBinding.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(singleIssue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY)); String cleanIssueDescription = singleIssue.getBody().trim(); - new Markdown(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription); + Markdown.render(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription); RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams(); diff --git a/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java index 5f2d04b5..a6db98d7 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java @@ -127,7 +127,7 @@ public class DraftsAdapter extends RecyclerView.Adapter()); - this.context = context; - this.markdown = markdown; - this.textView = textView; + private static final Pool rendererPool; - executorService.execute(new Renderer()); + static { + + Config config = new Config<>(); + + config.setBackgroundExpirationEnabled(true); + config.setPreciseLeakDetectionEnabled(true); + config.setSize(MAX_POOL_SIZE); + config.setAllocator(new Allocator() { + + @Override + public Renderer allocate(Slot slot) throws Exception { + return new Renderer(slot); + } + + @Override public void deallocate(Renderer poolable) throws Exception {} + + }); + + rendererPool = new BlazePool<>(config); } - private class Renderer implements Runnable { + public static void render(Context context, String markdown, TextView textView) { - @Override - public void run() { + try { + Renderer renderer = rendererPool.claim(timeout); + + if(renderer != null) { + renderer.setParameters(context, markdown, textView); + executorService.execute(renderer); + } + } catch(InterruptedException ignored) {} + } + + private static class Renderer implements Runnable, Poolable { + + private final Slot slot; + + private Markwon markwon; + + private Context context; + private String markdown; + private TextView textView; + + public Renderer(Slot slot) { + this.slot = slot; + } + + private void setup() { Prism4jTheme prism4jTheme = TinyDB.getInstance(context).getString("currentTheme").equals("dark") ? Prism4jThemeDarkula.create() : @@ -72,16 +122,56 @@ public class Markdown { @Override public void configureTheme(@NonNull MarkwonTheme.Builder builder) { builder.codeBlockTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/sourcecodeproregular.ttf")); + builder.codeBlockMargin((int) (context.getResources().getDisplayMetrics().density * 10)); + builder.blockMargin((int) (context.getResources().getDisplayMetrics().density * 10)); + builder.codeTextSize((int) (context.getResources().getDisplayMetrics().scaledDensity * 13)); builder.codeTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/sourcecodeproregular.ttf")); builder.linkColor(ResourcesCompat.getColor(context.getResources(), R.color.lightBlue, null)); } }); - Markwon markwon = builder.build(); - Spanned spanned = markwon.toMarkdown(markdown); + markwon = builder.build(); - textView.post(() -> markwon.setParsedMarkdown(textView, spanned)); + } + public void setParameters(Context context, String markdown, TextView textView) { + + this.context = context; + this.markdown = markdown; + this.textView = textView; + } + + @Override + public void run() { + + Objects.requireNonNull(context); + Objects.requireNonNull(markdown); + Objects.requireNonNull(textView); + + if(markwon == null) setup(); + + Spanned processedMarkdown = markwon.toMarkdown(markdown); + + TextView localReference = textView; + localReference.post(() -> localReference.setText(processedMarkdown)); + + release(); + + } + + @Override + public void release() { + + context = null; + markdown = null; + textView = null; + + slot.release(this); + + } + + public void expire() { + slot.expire(this); } } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/SyntaxHighlightedArea.java b/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java similarity index 98% rename from app/src/main/java/org/mian/gitnex/helpers/SyntaxHighlightedArea.java rename to app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java index 52686cfa..f7a65575 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/SyntaxHighlightedArea.java +++ b/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java @@ -1,4 +1,4 @@ -package org.mian.gitnex.helpers; +package org.mian.gitnex.helpers.views; import android.content.Context; import android.graphics.Canvas; @@ -16,6 +16,8 @@ import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.mian.gitnex.core.MainGrammarLocator; +import org.mian.gitnex.helpers.AppUtil; +import org.mian.gitnex.helpers.TinyDB; import io.noties.markwon.syntax.Prism4jSyntaxHighlight; import io.noties.markwon.syntax.Prism4jTheme; import io.noties.markwon.syntax.Prism4jThemeDarkula; diff --git a/app/src/main/res/layout/activity_file_view.xml b/app/src/main/res/layout/activity_file_view.xml index 4b857eb3..bc0870e8 100644 --- a/app/src/main/res/layout/activity_file_view.xml +++ b/app/src/main/res/layout/activity_file_view.xml @@ -99,7 +99,7 @@ - Date: Sat, 10 Apr 2021 20:29:21 +0200 Subject: [PATCH 4/4] Add private icon in repo detail toolbar, switch to if by gradle lint (#892) Hide repoTypeToolbar by default. Merge branch 'master' into add-repo-status-icon Add private icon in repo detail toolbar, switch to if by gradle lint Co-authored-by: opyale Co-authored-by: 6543 <6543@noreply.codeberg.org> Co-authored-by: M M Arif Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/892 Reviewed-by: opyale Co-Authored-By: M M Arif Co-Committed-By: M M Arif --- .../gitnex/activities/RepoDetailActivity.java | 88 +++++++++++-------- .../main/res/layout/activity_repo_detail.xml | 11 +++ 2 files changed, 61 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java index fb01d048..1022d0e8 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java @@ -17,6 +17,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; @@ -93,6 +94,14 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF Toolbar toolbar = findViewById(R.id.toolbar); TextView toolbarTitle = findViewById(R.id.toolbar_title); + ImageView repoTypeToolbar = findViewById(R.id.repoTypeToolbar); + + if(tinyDB.getString("repoType").equalsIgnoreCase("private")) { + repoTypeToolbar.setVisibility(View.VISIBLE); + } + else { + repoTypeToolbar.setVisibility(View.GONE); + } toolbarTitle.setText(repositoryName); setSupportActionBar(toolbar); @@ -267,46 +276,49 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF int id = item.getItemId(); - switch(id) { - - case android.R.id.home: - finish(); - return true; - - case R.id.repoMenu: - BottomSheetRepoFragment bottomSheet = new BottomSheetRepoFragment(); - bottomSheet.show(getSupportFragmentManager(), "repoBottomSheet"); - return true; - - case R.id.filter: - BottomSheetIssuesFilterFragment filterBottomSheet = new BottomSheetIssuesFilterFragment(); - filterBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuBottomSheet"); - return true; - - case R.id.filterPr: - BottomSheetPullRequestFilterFragment filterPrBottomSheet = new BottomSheetPullRequestFilterFragment(); - filterPrBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuPrBottomSheet"); - return true; - - case R.id.filterMilestone: - BottomSheetMilestonesFilterFragment filterMilestoneBottomSheet = new BottomSheetMilestonesFilterFragment(); - filterMilestoneBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuMilestoneBottomSheet"); - return true; - - case R.id.switchBranches: - chooseBranch(); - return true; - - case R.id.branchCommits: - Intent intent = new Intent(ctx, CommitsActivity.class); - intent.putExtra("branchName", tinyDB.getString("repoBranch")); - ctx.startActivity(intent); - return true; - - default: - return super.onOptionsItemSelected(item); + if(id == android.R.id.home) { + finish(); + return true; } + else if(id == R.id.repoMenu) { + + BottomSheetRepoFragment bottomSheet = new BottomSheetRepoFragment(); + bottomSheet.show(getSupportFragmentManager(), "repoBottomSheet"); + return true; + } + else if(id == R.id.filter) { + + BottomSheetIssuesFilterFragment filterBottomSheet = new BottomSheetIssuesFilterFragment(); + filterBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuBottomSheet"); + return true; + } + else if(id == R.id.filterPr) { + + BottomSheetPullRequestFilterFragment filterPrBottomSheet = new BottomSheetPullRequestFilterFragment(); + filterPrBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuPrBottomSheet"); + return true; + } + else if(id == R.id.filterMilestone) { + + BottomSheetMilestonesFilterFragment filterMilestoneBottomSheet = new BottomSheetMilestonesFilterFragment(); + filterMilestoneBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuMilestoneBottomSheet"); + return true; + } + else if(id == R.id.switchBranches) { + + chooseBranch(); + return true; + } + else if(id == R.id.branchCommits) { + + Intent intent = new Intent(ctx, CommitsActivity.class); + intent.putExtra("branchName", tinyDB.getString("repoBranch")); + ctx.startActivity(intent); + return true; + } + + return super.onOptionsItemSelected(item); } diff --git a/app/src/main/res/layout/activity_repo_detail.xml b/app/src/main/res/layout/activity_repo_detail.xml index 5e7710e3..c1a475c5 100644 --- a/app/src/main/res/layout/activity_repo_detail.xml +++ b/app/src/main/res/layout/activity_repo_detail.xml @@ -23,6 +23,17 @@ android:layout_weight="1" android:background="?attr/primaryBackgroundColor"> + +