1
0
mirror of https://codeberg.org/gitnex/GitNex.git synced 2025-10-05 15:52:46 +02:00

Redesign profile screen, render md in titles, improve repo info screen (#1508)

Closes #1507

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/1508
Co-authored-by: M M Arif <mmarif@swatian.com>
Co-committed-by: M M Arif <mmarif@swatian.com>
This commit is contained in:
M M Arif
2025-07-13 09:45:40 +02:00
committed by M M Arif
parent 0dfe124342
commit cab2fc573f
24 changed files with 606 additions and 786 deletions

View File

@@ -1,15 +1,15 @@
plugins {
id "com.diffplug.spotless" version "7.0.3"
id "com.diffplug.spotless" version "7.0.4"
}
apply plugin: 'com.android.application'
android {
defaultConfig {
applicationId "org.mian.gitnex"
minSdkVersion 23
targetSdkVersion 35
versionCode 900
versionName "9.0.0"
minSdkVersion 26
targetSdkVersion 36
versionCode 995
versionName "10.0.0-dev"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
compileSdk 35
@@ -67,19 +67,19 @@ dependencies {
implementation 'androidx.viewpager2:viewpager2:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.navigation:navigation-fragment:2.9.0"
implementation "androidx.navigation:navigation-ui:2.9.0"
implementation "androidx.navigation:navigation-fragment:2.9.1"
implementation "androidx.navigation:navigation-ui:2.9.1"
implementation "androidx.lifecycle:lifecycle-viewmodel:2.9.1"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.14'
implementation 'com.google.code.gson:gson:2.11.0'
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.17'
implementation 'com.google.code.gson:gson:2.13.1'
implementation 'com.github.ramseth001:TextDrawable:1.1.3'
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.14'
implementation 'com.squareup.retrofit2:retrofit:3.0.0'
implementation 'com.squareup.retrofit2:converter-gson:3.0.0'
implementation 'com.squareup.retrofit2:converter-scalars:3.0.0'
implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.17'
implementation 'org.ocpsoft.prettytime:prettytime:5.0.7.Final'
implementation "com.github.skydoves:colorpickerview:2.3.0"
implementation "io.noties.markwon:core:4.6.2"
@@ -100,14 +100,14 @@ dependencies {
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
implementation "com.caverock:androidsvg-aar:1.4"
implementation "pl.droidsonroids.gif:android-gif-drawable:1.2.29"
implementation 'com.google.guava:guava:33.3.1-jre'
implementation 'com.google.guava:guava:33.4.8-jre'
//noinspection GradleDependency
implementation 'commons-io:commons-io:2.5'
implementation 'org.apache.commons:commons-lang3:3.13.0'
implementation 'org.apache.commons:commons-lang3:3.18.0'
implementation "com.github.chrisbanes:PhotoView:2.3.0"
implementation 'ch.acra:acra-mail:5.11.3'
implementation 'ch.acra:acra-limiter:5.11.3'
implementation 'ch.acra:acra-notification:5.11.3'
implementation 'ch.acra:acra-mail:5.12.0'
implementation 'ch.acra:acra-limiter:5.12.0'
implementation 'ch.acra:acra-notification:5.12.0'
implementation 'androidx.room:room-runtime:2.7.2'
annotationProcessor 'androidx.room:room-compiler:2.7.2'
implementation "androidx.work:work-runtime:2.10.2"
@@ -116,7 +116,8 @@ dependencies {
//noinspection GradleDependency
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.1.5"
implementation 'androidx.biometric:biometric:1.1.0'
implementation 'com.github.chrisvest:stormpot:2.4.2'
//noinspection GradleDependency
implementation 'com.github.chrisvest:stormpot:3.2'
implementation 'androidx.browser:browser:1.8.0'
implementation 'com.google.android.flexbox:flexbox:3.0.0'
implementation('org.codeberg.gitnex:tea4j-autodeploy:0ad7eaf429') {

View File

@@ -1302,7 +1302,7 @@ public class IssueDetailActivity extends BaseActivity
}
}
final Locale locale = getResources().getConfiguration().locale;
Locale locale = getResources().getConfiguration().getLocales().get(0);
issueCreator = issue.getIssue().getUser().getLogin();
Glide.with(ctx)
@@ -1319,12 +1319,16 @@ public class IssueDetailActivity extends BaseActivity
+ appCtx.getResources().getString(R.string.hash)
+ issue.getIssue().getNumber()
+ "</font>";
viewBinding.issueTitle.setText(
Markdown.render(
ctx,
HtmlCompat.fromHtml(
issueNumber_
+ " "
+ EmojiParser.parseToUnicode(issue.getIssue().getTitle()),
HtmlCompat.FROM_HTML_MODE_LEGACY));
issueNumber_
+ " "
+ EmojiParser.parseToUnicode(issue.getIssue().getTitle()),
HtmlCompat.FROM_HTML_MODE_LEGACY)
.toString(),
viewBinding.issueTitle);
String cleanIssueDescription = issue.getIssue().getBody().trim();
if (!AppUtil.checkGhostUsers(issue.getIssue().getUser().getLogin())) {
@@ -1484,7 +1488,7 @@ public class IssueDetailActivity extends BaseActivity
String edited;
if (!issue.getIssue().getUpdatedAt().equals(issue.getIssue().getUpdatedAt())) {
if (!issue.getIssue().getCreatedAt().equals(issue.getIssue().getUpdatedAt())) {
edited = getString(R.string.colorfulBulletSpan) + getString(R.string.modifiedText);
viewBinding.issueModified.setVisibility(View.VISIBLE);

View File

@@ -36,6 +36,7 @@ import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.ColorInverter;
import org.mian.gitnex.helpers.LabelWidthCalculator;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.contexts.IssueContext;
@@ -175,7 +176,7 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@SuppressLint("SetTextI18n")
void bindData(Issue issue) {
Locale locale = context.getResources().getConfiguration().locale;
Locale locale = context.getResources().getConfiguration().getLocales().get(0);
Glide.with(context)
.load(issue.getUser().getAvatarUrl())
@@ -192,10 +193,15 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
+ context.getResources().getString(R.string.hash)
+ issue.getNumber()
+ "</font>";
issueTitle.setText(
Markdown.render(
context,
HtmlCompat.fromHtml(
issueNumber_ + " " + EmojiParser.parseToUnicode(issue.getTitle()),
HtmlCompat.FROM_HTML_MODE_LEGACY));
issueNumber_
+ " "
+ EmojiParser.parseToUnicode(issue.getTitle()),
HtmlCompat.FROM_HTML_MODE_LEGACY)
.toString(),
issueTitle);
this.issueObject = issue;
this.issueCommentsCount.setText(String.valueOf(issue.getComments()));

View File

@@ -37,6 +37,7 @@ import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.ColorInverter;
import org.mian.gitnex.helpers.LabelWidthCalculator;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.contexts.IssueContext;
@@ -181,7 +182,7 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
void bindData(PullRequest pullRequest) {
Locale locale = context.getResources().getConfiguration().locale;
Locale locale = context.getResources().getConfiguration().getLocales().get(0);
Glide.with(context)
.load(pullRequest.getUser().getAvatarUrl())
@@ -309,10 +310,16 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
this.issuePrState.setVisibility(View.GONE);
}
this.prTitle.setText(
Markdown.render(
context,
HtmlCompat.fromHtml(
prNumber_ + " " + EmojiParser.parseToUnicode(pullRequest.getTitle()),
HtmlCompat.FROM_HTML_MODE_LEGACY));
prNumber_
+ " "
+ EmojiParser.parseToUnicode(pullRequest.getTitle()),
HtmlCompat.FROM_HTML_MODE_LEGACY)
.toString(),
this.prTitle);
this.prCommentsCount.setText(String.valueOf(pullRequest.getComments()));
this.prCreatedTime.setText(TimeHelper.formatTime(pullRequest.getCreatedAt(), locale));

View File

@@ -391,7 +391,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter
(int)
requireContext()
.getResources()
.getDimension(R.dimen.dimen16dp);
.getDimension(R.dimen.dimen4dp);
int spacingTop =
(int)
requireContext()

View File

@@ -1,25 +1,24 @@
package org.mian.gitnex.fragments;
import static org.mian.gitnex.helpers.languagestatistics.LanguageColor.languageColor;
import static org.mian.gitnex.helpers.languagestatistics.LanguageStatisticsHelper.calculatePercentage;
import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import com.amulyakhare.textdrawable.TextDrawable;
import com.google.android.material.chip.Chip;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.shape.CornerFamily;
import com.google.android.material.shape.ShapeAppearanceModel;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;
@@ -45,13 +44,15 @@ import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import org.mian.gitnex.helpers.languagestatistics.LanguageColor;
import org.mian.gitnex.helpers.languagestatistics.LanguageStatisticsHelper;
import org.mian.gitnex.helpers.languagestatistics.SeekbarItem;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* @author M M Arif
* @author mmarif
*/
public class RepoInfoFragment extends Fragment {
@@ -82,7 +83,7 @@ public class RepoInfoFragment extends Fragment {
binding = FragmentRepoInfoBinding.inflate(inflater, container, false);
ctx = getContext();
Locale locale = getResources().getConfiguration().locale;
Locale locale = getResources().getConfiguration().getLocales().get(0);
pageContent = binding.repoInfoLayout;
pageContent.setVisibility(View.GONE);
@@ -156,127 +157,75 @@ public class RepoInfoFragment extends Fragment {
seekbarItemList.add(seekbarItem);
}
binding.languagesStatistic.setVisibility(View.VISIBLE);
binding.languagesStatistic.initData(seekbarItemList);
binding.languageStatsCard.setVisibility(View.VISIBLE);
binding.languagesStatistic.setData(seekbarItemList);
binding.languagesStatistic.setOnSeekBarChangeListener(
new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(
SeekBar seekBar) {}
@Override
public void onStartTrackingTouch(
SeekBar seekBar) {}
@Override
public void onProgressChanged(
SeekBar seekBar,
int progress,
boolean fromUser) {
View view =
LayoutInflater.from(ctx)
.inflate(
R.layout
.layout_repo_language_statistics,
null);
binding.languageStatsCard.setOnClickListener(
v -> {
View view =
LayoutInflater.from(ctx)
.inflate(
R.layout
.layout_repo_language_statistics,
null);
LinearLayout layout =
view.findViewById(R.id.lang_color);
layout.removeAllViews();
for (Map.Entry<String, Long> entry :
response.body().entrySet()) {
Chip chip = new Chip(ctx);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams
.WRAP_CONTENT,
.MATCH_PARENT,
LinearLayout.LayoutParams
.WRAP_CONTENT);
params.setMargins(0, 32, 32, 0);
params.setMargins(0, 8, 0, 0);
chip.setLayoutParams(params);
chip.setText(
String.format(
"%s - %s%%",
entry.getKey(),
LanguageStatisticsHelper
.calculatePercentage(
entry
.getValue(),
totalSpan)));
int bgColor =
ctx.getResources()
.getColor(
LanguageColor
.languageColor(
entry
.getKey()),
null);
chip.setChipBackgroundColor(
ColorStateList.valueOf(bgColor));
chip.setTextColor(
isLightColor(bgColor)
? Color.BLACK
: Color.WHITE);
chip.setShapeAppearanceModel(
new ShapeAppearanceModel()
.toBuilder()
.setAllCorners(
CornerFamily
.ROUNDED,
48)
.build());
chip.setEnabled(false);
LinearLayout layout =
view.findViewById(R.id.lang_color);
layout.removeAllViews();
for (Map.Entry<String, Long> entry :
response.body().entrySet()) {
LinearLayout layoutSub =
new LinearLayout(getContext());
layoutSub.setOrientation(
LinearLayout.HORIZONTAL);
layoutSub.setGravity(
Gravity.START | Gravity.TOP);
layout.addView(layoutSub);
ImageView colorView =
new ImageView(getContext());
colorView.setLayoutParams(params);
String hexColor =
String.format(
"#%06X",
(0xFFFFFF
& languageColor(
entry
.getKey())));
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.width(64)
.height(64)
.endConfig()
.buildRoundRect(
"",
Color
.parseColor(
hexColor),
8);
drawable.setTint(
getResources()
.getColor(
languageColor(
entry
.getKey()),
null));
colorView.setImageDrawable(drawable);
layoutSub.addView(colorView);
TextView langName =
new TextView(getContext());
langName.setLayoutParams(params);
langName.setText(entry.getKey());
layoutSub.addView(langName);
TextView langPercentage =
new TextView(getContext());
langPercentage.setLayoutParams(params);
langPercentage.setTextSize(12);
langPercentage.setText(
getString(
R.string
.lang_percentage,
calculatePercentage(
entry
.getValue(),
totalSpan)));
layoutSub.addView(langPercentage);
}
MaterialAlertDialogBuilder
materialAlertDialogBuilder1 =
new MaterialAlertDialogBuilder(
ctx)
.setTitle(
R.string
.lang_statistics)
.setView(view)
.setNeutralButton(
getString(
R
.string
.close),
null);
materialAlertDialogBuilder1.create().show();
layout.addView(chip);
}
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.lang_statistics)
.setView(view)
.setNeutralButton(
getString(R.string.close), null)
.create()
.show();
});
}
@@ -287,7 +236,7 @@ public class RepoInfoFragment extends Fragment {
break;
case 404:
binding.languagesStatistic.setVisibility(View.GONE);
binding.languageStatsCard.setVisibility(View.GONE);
break;
}
}
@@ -301,6 +250,13 @@ public class RepoInfoFragment extends Fragment {
});
}
private boolean isLightColor(int color) {
double luminance =
(0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color))
/ 255;
return luminance > 0.5;
}
private void setRepoInfo(Locale locale) {
Repository repoInfo = repository.getRepository();
@@ -376,7 +332,7 @@ public class RepoInfoFragment extends Fragment {
: repoInfo.getWebsite();
binding.repoMetaWebsite.setText(website);
binding.repoMetaWebsite.setLinksClickable(false);
binding.websiteFrame.setOnClickListener(
binding.repoMetaWebsite.setOnClickListener(
(v) -> {
if (!repoInfo.getWebsite().isEmpty()) {
AppUtil.openUrlInBrowser(requireContext(), repoInfo.getWebsite());

View File

@@ -118,10 +118,12 @@ public class DetailFragment extends Fragment {
((ProfileActivity) requireActivity()).viewPager.setCurrentItem(2));
if (username.equals(((BaseActivity) context).getAccount().getAccount().getUserName())) {
binding.metaProfile.setVisibility(View.VISIBLE);
binding.updateAvatar.setVisibility(View.VISIBLE);
binding.updateProfile.setVisibility(View.VISIBLE);
itsMe = true;
} else {
binding.metaProfile.setVisibility(View.GONE);
binding.updateAvatar.setVisibility(View.GONE);
binding.updateProfile.setVisibility(View.GONE);
}
binding.updateProfile.setOnClickListener(
@@ -475,7 +477,7 @@ public class DetailFragment extends Fragment {
String.format(
response.body().getStarredReposCount()
+ " "
+ getString(R.string.starredRepos)));
+ getString(R.string.navStarredRepos)));
String[] userLanguageCodes =
response.body().getLanguage().split("-");
@@ -520,14 +522,12 @@ public class DetailFragment extends Fragment {
binding.website.setText(response.body().getWebsite());
} else {
binding.website.setText(R.string.noDataWebsite);
binding.website.setAlpha(.4F);
}
if (!response.body().getLocation().isEmpty()) {
binding.location.setText(response.body().getLocation());
} else {
binding.location.setText(R.string.noDataLocation);
binding.location.setAlpha(.4F);
}
if (!response.body().getDescription().isEmpty()) {
@@ -537,7 +537,6 @@ public class DetailFragment extends Fragment {
binding.bio);
} else {
binding.bio.setText(R.string.noDataBio);
binding.bio.setAlpha(.4F);
}
break;

View File

@@ -66,8 +66,6 @@ import org.mian.gitnex.helpers.contexts.IssueContext;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import org.mian.gitnex.helpers.markdown.AlertPlugin;
import stormpot.Allocator;
import stormpot.BlazePool;
import stormpot.Config;
import stormpot.Pool;
import stormpot.Poolable;
import stormpot.Slot;
@@ -75,6 +73,7 @@ import stormpot.Timeout;
/**
* @author opyale
* @author mmarif
*/
public class Markdown {
@@ -95,44 +94,37 @@ public class Markdown {
private static final Pool<RecyclerViewRenderer> rvRendererPool;
static {
Config<Renderer> config = new Config<>();
rendererPool =
Pool.from(
new Allocator<Renderer>() {
@Override
public Renderer allocate(Slot slot) {
return new Renderer(slot);
}
config.setBackgroundExpirationEnabled(true);
config.setPreciseLeakDetectionEnabled(true);
config.setSize(MAX_OBJECT_POOL_SIZE);
config.setAllocator(
new Allocator<Renderer>() {
@Override
public void deallocate(Renderer poolable) {}
})
.setSize(MAX_OBJECT_POOL_SIZE)
.setBackgroundExpirationEnabled(true)
.setPreciseLeakDetectionEnabled(true)
.build();
@Override
public Renderer allocate(Slot slot) {
return new Renderer(slot);
}
rvRendererPool =
Pool.from(
new Allocator<RecyclerViewRenderer>() {
@Override
public RecyclerViewRenderer allocate(Slot slot) {
return new RecyclerViewRenderer(slot);
}
@Override
public void deallocate(Renderer poolable) {}
});
rendererPool = new BlazePool<>(config);
Config<RecyclerViewRenderer> configRv = new Config<>();
configRv.setBackgroundExpirationEnabled(true);
configRv.setPreciseLeakDetectionEnabled(true);
configRv.setSize(MAX_OBJECT_POOL_SIZE);
configRv.setAllocator(
new Allocator<RecyclerViewRenderer>() {
@Override
public RecyclerViewRenderer allocate(Slot slot) {
return new RecyclerViewRenderer(slot);
}
@Override
public void deallocate(RecyclerViewRenderer poolable) {}
});
rvRendererPool = new BlazePool<>(configRv);
@Override
public void deallocate(RecyclerViewRenderer poolable) {}
})
.setSize(MAX_OBJECT_POOL_SIZE)
.setBackgroundExpirationEnabled(true)
.setPreciseLeakDetectionEnabled(true)
.build();
}
public static void render(Context context, String markdown, TextView textView) {

View File

@@ -5,11 +5,9 @@ import java.util.Map;
import org.mian.gitnex.R;
/**
* @author M M Arif
* @author mmarif
*/
public class LanguageColor {
private static int color = R.color.default_lang_color;
private static final Map<String, Integer> colors = new HashMap<>();
static {
@@ -208,16 +206,14 @@ public class LanguageColor {
colors.put("robots.txt", R.color.yaml);
colors.put("sed", R.color.sed);
colors.put("xBase", R.color.x_base);
colors.put("D", R.color.wiki);
}
public static int languageColor(String key) {
for (Map.Entry<String, Integer> s : colors.entrySet()) {
if (key.equalsIgnoreCase(s.getKey())) {
color = s.getValue();
}
if (key == null) {
return R.color.default_lang_color;
}
return color;
Integer color = colors.get(key);
return color != null ? color : R.color.default_lang_color;
}
}

View File

@@ -1,78 +0,0 @@
package org.mian.gitnex.helpers.languagestatistics;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import java.util.ArrayList;
/**
* @author M M Arif
*/
public class LanguageStatisticsBar extends androidx.appcompat.widget.AppCompatSeekBar {
private ArrayList<SeekbarItem> progressItemsList;
public LanguageStatisticsBar(Context context) {
super(context);
}
public LanguageStatisticsBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LanguageStatisticsBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void initData(ArrayList<SeekbarItem> progressItemsListInit) {
this.progressItemsList = progressItemsListInit;
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
protected void onDraw(Canvas canvas) {
if (!progressItemsList.isEmpty()) {
int progressBarWidth = getWidth();
int progressBarHeight = getHeight();
int thumbOffSet = getThumbOffset();
int lastProgressX = 0;
int progressItemWidth, progressItemRight;
for (int i = 0; i < progressItemsList.size(); i++) {
SeekbarItem progressItem = progressItemsList.get(i);
@SuppressLint("DrawAllocation")
Paint progressPaint = new Paint();
progressPaint.setColor(getResources().getColor(progressItem.color, null));
progressItemWidth =
(int) (progressItem.progressItemPercentage * progressBarWidth / 100);
progressItemRight = lastProgressX + progressItemWidth;
if (i == progressItemsList.size() - 1 && progressItemRight != progressBarWidth) {
progressItemRight = progressBarWidth;
}
@SuppressLint("DrawAllocation")
Rect progressRect = new Rect();
progressRect.set(
lastProgressX,
thumbOffSet / 2,
progressItemRight,
progressBarHeight - thumbOffSet / 2);
canvas.drawRect(progressRect, progressPaint);
lastProgressX = progressItemRight;
}
super.onDraw(canvas);
}
}
}

View File

@@ -3,7 +3,7 @@ package org.mian.gitnex.helpers.languagestatistics;
import android.annotation.SuppressLint;
/**
* @author M M Arif
* @author mmarif
*/
public class LanguageStatisticsHelper {

View File

@@ -0,0 +1,80 @@
package org.mian.gitnex.helpers.languagestatistics;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.NonNull;
import java.util.ArrayList;
/**
* @author mmarif
*/
public class LanguageStatisticsView extends View {
private ArrayList<SeekbarItem> progressItemsList;
private static final float CORNER_RADIUS = 8f;
private final Paint progressPaint = new Paint();
private final RectF progressRect = new RectF();
public LanguageStatisticsView(Context context) {
super(context);
init();
}
public LanguageStatisticsView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public LanguageStatisticsView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
progressItemsList = new ArrayList<>();
}
public void setData(ArrayList<SeekbarItem> progressItemsListInit) {
this.progressItemsList = progressItemsListInit;
invalidate();
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
if (progressItemsList.isEmpty()) return;
int width = getWidth();
int height = getHeight();
float lastX = 0f;
for (int i = 0; i < progressItemsList.size(); i++) {
SeekbarItem progressItem = progressItemsList.get(i);
progressPaint.setColor(getResources().getColor(progressItem.color, null));
float progressItemWidth = (progressItem.progressItemPercentage * width) / 100f;
float progressItemRight = lastX + progressItemWidth;
if (i == progressItemsList.size() - 1 && progressItemRight < width) {
progressItemRight = width;
}
progressRect.set(lastX, 0f, progressItemRight, height);
canvas.drawRoundRect(progressRect, CORNER_RADIUS, CORNER_RADIUS, progressPaint);
lastX = progressItemRight;
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(
MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
}
}

View File

@@ -1,7 +1,7 @@
package org.mian.gitnex.helpers.languagestatistics;
/**
* @author M M Arif
* @author mmarif
*/
public class SeekbarItem {

View File

@@ -168,7 +168,7 @@
style="@style/CustomChipFilter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/starredRepos" />
android:text="@string/navStarredRepos" />
<com.google.android.material.chip.Chip
android:id="@+id/chipHomeScreen3"

View File

@@ -33,7 +33,6 @@
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/hoursInputLayout"
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@@ -52,7 +51,6 @@
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/minutesInputLayout"
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@@ -75,6 +73,7 @@
android:layout_height="@dimen/dimen50dp"
android:text="@string/addButton"
android:minWidth="0dp"
android:backgroundTint="?attr/iconsColor"
android:paddingHorizontal="@dimen/dimen16dp" />
</LinearLayout>

View File

@@ -11,8 +11,10 @@
android:layout_height="wrap_content"
android:text="@string/pageTitleChooseBranch"
android:textAppearance="?attr/textAppearanceHeadline5"
android:layout_marginBottom="@dimen/dimen8dp"
android:padding="@dimen/dimen16dp" />
android:layout_marginBottom="@dimen/dimen16dp"
android:layout_marginStart="@dimen/dimen8dp"
android:layout_marginEnd="@dimen/dimen8dp"
android:layout_marginTop="@dimen/dimen8dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"

View File

@@ -92,6 +92,8 @@
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen8dp"
android:layout_marginEnd="@dimen/dimen8dp"
android:orientation="vertical">
<TextView
@@ -99,7 +101,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp"
android:textSize="@dimen/dimen18sp"
android:textIsSelectable="true" />
<TextView

View File

@@ -47,130 +47,273 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:orientation="vertical"
android:gravity="start"
tools:ignore="UseCompoundDrawables">
<com.google.android.material.card.MaterialCardView
android:layout_width="@dimen/dimen96dp"
android:layout_height="@dimen/dimen96dp"
style="?attr/materialCardViewElevatedStyle"
android:backgroundTint="@android:color/transparent"
android:layout_marginBottom="@dimen/dimen8dp"
app:cardElevation="@dimen/dimen0dp"
app:cardCornerRadius="@dimen/dimen16dp">
<ImageView
android:id="@+id/userAvatar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/loader_animated"
android:contentDescription="@string/generalImgContentText" />
</com.google.android.material.card.MaterialCardView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/dimen24dp"
android:paddingEnd="@dimen/dimen10dp"
android:orientation="vertical">
android:orientation="horizontal">
<TextView
android:id="@+id/userFullName"
<com.google.android.material.card.MaterialCardView
android:layout_width="@dimen/dimen84dp"
android:layout_height="@dimen/dimen84dp"
style="?attr/materialCardViewElevatedStyle"
android:backgroundTint="@android:color/transparent"
android:layout_marginBottom="@dimen/dimen8dp"
app:cardElevation="@dimen/dimen0dp"
app:cardCornerRadius="@dimen/dimen16dp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/userAvatar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/loader_animated"
android:contentDescription="@string/generalImgContentText"
tools:ignore="TooDeepLayout" />
<ImageView
android:id="@+id/update_avatar"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:layout_gravity="top|end"
android:src="@drawable/ic_edit"
android:contentDescription="@string/userAvatar"
android:background="@color/dividerColorDark"
android:alpha=".8"
android:padding="@dimen/dimen4dp" />
</FrameLayout>
</com.google.android.material.card.MaterialCardView>
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<com.google.android.material.button.MaterialButton
android:id="@+id/update_profile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textIsSelectable="true"
android:textSize="@dimen/dimen18sp" />
android:text="@string/editSettings"
android:layout_gravity="end"
android:textColor="?attr/materialCardBackgroundColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:orientation="vertical">
<TextView
android:id="@+id/userLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen10dp"
android:textColor="?attr/primaryTextColor"
android:textIsSelectable="true"
android:layout_marginTop="@dimen/dimen4dp"
android:alpha=".8"
android:textSize="@dimen/dimen14sp" />
<com.google.android.material.button.MaterialButtonToggleGroup
android:id="@+id/metaProfile"
<TextView
android:id="@+id/userFullName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone">
android:layout_marginTop="@dimen/dimen4dp"
android:layout_marginBottom="@dimen/dimen12dp"
android:textColor="?attr/primaryTextColor"
android:textIsSelectable="true"
android:textSize="@dimen/dimen20sp" />
<Button
android:id="@+id/update_avatar"
style="?attr/materialButtonToggleGroupStyle"
<TextView
android:id="@+id/bio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:layout_marginBottom="@dimen/dimen16dp"
android:textSize="@dimen/dimen16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen12dp"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:src="@drawable/ic_person"
android:contentDescription="@string/generalImgContentText" />
<TextView
android:id="@+id/user_followers_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:iconTint="?attr/materialCardBackgroundColor"
app:icon="@drawable/ic_person"
android:textColor="?attr/materialCardBackgroundColor"
android:textSize="@dimen/dimen14sp"
android:text="@string/userAvatar" />
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:text="@string/profileTabFollowers"
android:textSize="@dimen/dimen14sp" />
<Button
android:id="@+id/update_profile"
style="?attr/materialButtonToggleGroupStyle"
<TextView
android:id="@+id/user_following_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:iconTint="?attr/materialCardBackgroundColor"
app:icon="@drawable/ic_edit"
android:textColor="?attr/materialCardBackgroundColor"
android:textSize="@dimen/dimen14sp"
android:text="@string/navProfile" />
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:text="@string/profileTabFollowing"
android:textSize="@dimen/dimen14sp" />
</com.google.android.material.button.MaterialButtonToggleGroup>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen12dp"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:src="@drawable/ic_star_unfilled"
android:contentDescription="@string/generalImgContentText" />
<TextView
android:id="@+id/user_starred_repos_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:text="@string/navStarredRepos"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen12dp"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:src="@drawable/ic_email"
android:contentDescription="@string/generalImgContentText" />
<TextView
android:id="@+id/userEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:autoLink="email"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen12dp"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:src="@drawable/ic_link"
android:contentDescription="@string/generalImgContentText" />
<TextView
android:id="@+id/website"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:autoLink="web"
android:text="@string/websiteText"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen12dp"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:src="@drawable/ic_location"
android:contentDescription="@string/generalImgContentText" />
<TextView
android:id="@+id/location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen12dp"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:src="@drawable/ic_language"
android:contentDescription="@string/generalImgContentText" />
<TextView
android:id="@+id/userLang"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen12dp"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:src="@drawable/ic_calendar"
android:contentDescription="@string/generalImgContentText" />
<TextView
android:id="@+id/userJoinedOn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen20dp"
android:layout_marginBottom="@dimen/dimen0dp"
android:orientation="horizontal"
android:gravity="center"
android:baselineAligned="false">
<com.google.android.material.button.MaterialButtonToggleGroup
android:id="@+id/metaInfoGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/user_followers_count"
style="?attr/materialButtonToggleGroupStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/dimen14sp"
android:textStyle="bold"
android:text="@string/profileTabFollowers" />
<Button
android:id="@+id/user_following_count"
style="?attr/materialButtonToggleGroupStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/dimen14sp"
android:textStyle="bold"
android:text="@string/profileTabFollowing" />
<Button
android:id="@+id/user_starred_repos_count"
style="?attr/materialButtonToggleGroupStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/dimen14sp"
android:textStyle="bold"
android:text="@string/starredRepos" />
</com.google.android.material.button.MaterialButtonToggleGroup>
</LinearLayout>
<GridView
android:id="@+id/heatmapGrid"
android:layout_width="match_parent"
@@ -178,239 +321,9 @@
android:numColumns="12"
android:gravity="center"
android:verticalSpacing="@dimen/dimen6dp"
android:layout_marginTop="@dimen/dimen24dp"
android:layout_marginTop="@dimen/dimen12dp"
android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_email" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/userEmail"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/userEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:autoLink="email"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_browser" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/websiteText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/website"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:autoLink="web"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_location" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/locationText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_language"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsLanguageSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/userLang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_file_description" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bioText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/bio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_calendar"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/joined"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/userJoinedOn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>

View File

@@ -93,17 +93,20 @@
android:textColorLink="@color/lightBlue"
android:textSize="@dimen/dimen16sp"/>
<org.mian.gitnex.helpers.languagestatistics.LanguageStatisticsBar
android:id="@+id/languages_statistic"
<com.google.android.material.card.MaterialCardView
android:id="@+id/language_stats_card"
android:layout_width="match_parent"
android:layout_height="@dimen/dimen22dp"
android:layout_marginTop="@dimen/dimen4dp"
android:thumbTint="@android:color/transparent"
android:clickable="false"
android:focusable="false"
android:enabled="false"
android:progressDrawable="@android:color/transparent"
android:visibility="gone" />
android:layout_height="wrap_content"
app:cardCornerRadius="@dimen/dimen16dp"
app:cardElevation="0dp"
app:cardBackgroundColor="@android:color/transparent">
<org.mian.gitnex.helpers.languagestatistics.LanguageStatisticsView
android:id="@+id/languages_statistic"
android:layout_width="match_parent"
android:layout_height="@dimen/dimen14dp" />
</com.google.android.material.card.MaterialCardView>
<LinearLayout
android:layout_width="match_parent"
@@ -163,161 +166,114 @@
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen12dp"
android:layout_marginBottom="@dimen/dimen16dp"
android:orientation="horizontal"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:contentDescription="@string/size"
app:srcCompat="@drawable/ic_download"/>
<TextView
android:id="@+id/repoMetaSize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp"
tools:text="29"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen16dp"
android:orientation="horizontal"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:contentDescription="@string/infoTabRepoCreatedAt"
app:srcCompat="@drawable/ic_calendar"/>
<TextView
android:id="@+id/repoMetaCreatedAt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp"
tools:text="29"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen16dp"
android:orientation="horizontal"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
android:contentDescription="@string/websiteText"
app:srcCompat="@drawable/ic_link"/>
<TextView
android:id="@+id/repoMetaWebsite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:autoLink="web"
android:textColorLink="@color/lightBlue"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp"
tools:text="29"/>
</LinearLayout>
<LinearLayout
android:id="@+id/repo_fork_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="?android:attr/selectableItemBackground"
android:paddingTop="@dimen/dimen8dp"
android:paddingBottom="@dimen/dimen8dp"
android:layout_marginBottom="@dimen/dimen16dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp">
<ImageView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/dimen18dp"
android:layout_height="@dimen/dimen18dp"
app:srcCompat="@drawable/ic_fork"
android:contentDescription="@string/generalImgContentText"/>
<TextView
android:id="@+id/repo_fork"
android:layout_marginStart="15dp"
android:layout_marginStart="@dimen/dimen16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen12dp"
android:layout_marginBottom="@dimen/dimen20dp"
android:orientation="horizontal"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp">
<ImageView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/size"
app:srcCompat="@drawable/ic_download"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/size"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp"/>
<TextView
android:id="@+id/repoMetaSize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp"
tools:text="29"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:orientation="horizontal"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp">
<ImageView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/infoTabRepoCreatedAt"
app:srcCompat="@drawable/ic_calendar"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/infoTabRepoCreatedAt"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp"/>
<TextView
android:id="@+id/repoMetaCreatedAt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp"
tools:text="29"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen20dp"
android:orientation="horizontal"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp">
<ImageView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/websiteText"
app:srcCompat="@drawable/ic_link"/>
<LinearLayout
android:id="@+id/websiteFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/websiteText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp"/>
<TextView
android:id="@+id/repoMetaWebsite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:autoLink="web"
android:textColorLink="@color/lightBlue"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp"
tools:text="29"/>
</LinearLayout>
android:textSize="@dimen/dimen14sp"/>
</LinearLayout>

View File

@@ -8,6 +8,7 @@
<dimen name="dimen8dp">8dp</dimen>
<dimen name="dimen10dp">10dp</dimen>
<dimen name="dimen12dp">12dp</dimen>
<dimen name="dimen14dp">14dp</dimen>
<dimen name="dimen16dp">16dp</dimen>
<dimen name="dimen18dp">18dp</dimen>
<dimen name="dimen20dp">20dp</dimen>

View File

@@ -933,8 +933,6 @@
<string name="commitStatuses">Statuses</string>
<string name="statusNoUrl">This status has no linked target URL.</string>
<string name="starredRepos">Starred Repos</string>
<string name="lang_statistics">Language Statistics</string>
<string name="lang_percentage" translatable="false">%s%%</string>

View File

@@ -1,23 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<changelog>
<release version="9.0.0" versioncode="900">
<type name="🎉 Features 🎉">
<change>Redesigned home screen</change>
<change>Markdown alert support</change>
<change>Repository sorting (requires Forgejo 11.x)</change>
<change>Revamped login screen UI</change>
<change>Revamped app settings</change>
</type>
<type name="🚀 Improvements 🚀">
<change>Improved changelog UI</change>
<change>Added popup on login screen explaining where to get a token</change>
<change>Theme improvements across the app</change>
</type>
<type name="🐛 Bug Fixes 🐛">
<change>Fixed login screen issue</change>
<change>Fixed French translation on the Appearance screen</change>
<change>Fixed duplicate labels in issue/pr</change>
<release version="10.0.0-dev" versioncode="995">
<type name="Dev">
<change>Under development</change>
</type>
</release>

View File

@@ -7,7 +7,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.10.1'
classpath 'com.android.tools.build:gradle:8.11.1'
}
}

View File

@@ -1,6 +1,6 @@
#Tue Jul 11 23:34:25 PKT 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists