Language statistics

This commit is contained in:
M M Arif 2023-04-03 23:27:32 +05:00
parent f05f9229f5
commit 56bab586d9
11 changed files with 932 additions and 7 deletions

View file

@ -56,14 +56,14 @@ configurations {
dependencies {
def lifecycle_version = '2.6.0'
def markwon_version = '4.6.2'
def work_version = '2.8.0'
def work_version = '2.8.1'
def acra = '5.9.7'
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0-beta01'
implementation 'androidx.compose.material3:material3:1.1.0-alpha08'
implementation 'androidx.compose.material3:material3-window-size-class:1.1.0-alpha08'
implementation 'androidx.compose.material3:material3:1.1.0-beta01'
implementation 'androidx.compose.material3:material3-window-size-class:1.1.0-beta01'
implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "androidx.legacy:legacy-support-v4:1.0.0"
@ -103,8 +103,8 @@ dependencies {
implementation "ch.acra:acra-mail:$acra"
implementation "ch.acra:acra-limiter:$acra"
implementation "ch.acra:acra-notification:$acra"
implementation 'androidx.room:room-runtime:2.5.0'
annotationProcessor 'androidx.room:room-compiler:2.5.0'
implementation 'androidx.room:room-runtime:2.5.1'
annotationProcessor 'androidx.room:room-compiler:2.5.1'
implementation "androidx.work:work-runtime:$work_version"
implementation "io.mikael:urlbuilder:2.0.9"
implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2"

View file

@ -72,7 +72,7 @@ public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.NotesViewHol
materialAlertDialogBuilder
.setTitle(ctx.getString(R.string.menuDeleteText))
.setMessage(ctx.getString(R.string.noteDeleteDialoMessage))
.setMessage(ctx.getString(R.string.noteDeleteDialogMessage))
.setPositiveButton(
R.string.menuDeleteText,
(dialog, whichButton) ->

View file

@ -1,18 +1,28 @@
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.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.fragment.app.Fragment;
import com.amulyakhare.textdrawable.TextDrawable;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Map;
import okhttp3.ResponseBody;
import org.apache.commons.io.FileUtils;
import org.gitnex.tea4j.v2.models.Organization;
@ -34,6 +44,7 @@ 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.SeekbarItem;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -104,6 +115,8 @@ public class RepoInfoFragment extends Fragment {
binding.repoMetaPullRequestsFrame.setOnClickListener(
metaPR -> ((RepoDetailActivity) requireActivity()).viewPager.setCurrentItem(3));
setLanguageStatistics();
return binding.getRoot();
}
@ -145,6 +158,201 @@ public class RepoInfoFragment extends Fragment {
return binding.repoMetaFrame.getVisibility() == View.VISIBLE;
}
private void setLanguageStatistics() {
Call<Map<String, Long>> call =
RetrofitClient.getApiInterface(getContext())
.repoGetLanguages(repository.getOwner(), repository.getName());
call.enqueue(
new Callback<>() {
@Override
public void onResponse(
@NonNull Call<Map<String, Long>> call,
@NonNull Response<Map<String, Long>> response) {
if (isAdded()) {
switch (response.code()) {
case 200:
assert response.body() != null;
if (response.body().size() > 0) {
ArrayList<SeekbarItem> seekbarItemList = new ArrayList<>();
float totalSpan =
(float)
response.body().values().stream()
.mapToDouble(a -> a)
.sum();
for (Map.Entry<String, Long> entry :
response.body().entrySet()) {
SeekbarItem seekbarItem = new SeekbarItem();
seekbarItem.progressItemPercentage =
(entry.getValue() / totalSpan) * 100;
seekbarItem.color = languageColor(entry.getKey());
seekbarItemList.add(seekbarItem);
}
binding.languagesStatistic.setVisibility(View.VISIBLE);
binding.languagesStatistic.initData(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);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams
.WRAP_CONTENT,
LinearLayout.LayoutParams
.WRAP_CONTENT);
params.setMargins(0, 32, 32, 0);
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();
}
});
}
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 403:
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
binding.languagesStatistic.setVisibility(View.GONE);
break;
case 404:
binding.languagesStatistic.setVisibility(View.GONE);
break;
default:
Toasty.error(getContext(), getString(R.string.genericError));
binding.languagesStatistic.setVisibility(View.GONE);
break;
}
}
}
@Override
public void onFailure(
@NonNull Call<Map<String, Long>> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
private void setRepoInfo(Locale locale) {
Repository repoInfo = repository.getRepository();

View file

@ -0,0 +1,410 @@
package org.mian.gitnex.helpers.languagestatistics;
import org.mian.gitnex.R;
/**
* @author M M Arif
*/
public class LanguageColor {
public static int languageColor(String key) {
int color;
if (key.equalsIgnoreCase("ASP.NET")) {
color = R.color.default_lang_color;
} else if (key.equalsIgnoreCase("ATS")) {
color = R.color.ats;
} else if (key.equalsIgnoreCase("ActionScript")) {
color = R.color.action_script;
} else if (key.equalsIgnoreCase("Ada")) {
color = R.color.ada;
} else if (key.equalsIgnoreCase("AngelScript")) {
color = R.color.angel_script;
} else if (key.equalsIgnoreCase("Ant Build System")) {
color = R.color.ant_build_system;
} else if (key.equalsIgnoreCase("Antlers")) {
color = R.color.antlers;
} else if (key.equalsIgnoreCase("ApacheConf")) {
color = R.color.apache_conf;
} else if (key.equalsIgnoreCase("Apex")) {
color = R.color.apex;
} else if (key.equalsIgnoreCase("AppleScript")) {
color = R.color.apple_script;
} else if (key.equalsIgnoreCase("AsciiDoc")) {
color = R.color.ascii_doc;
} else if (key.equalsIgnoreCase("Assembly")) {
color = R.color.assembly;
} else if (key.equalsIgnoreCase("Awk")) {
color = R.color.awk;
} else if (key.equalsIgnoreCase("BASIC")) {
color = R.color.basic;
} else if (key.equalsIgnoreCase("Batchfile")) {
color = R.color.batch_file;
} else if (key.equalsIgnoreCase("Bison")) {
color = R.color.bison;
} else if (key.equalsIgnoreCase("Blade")) {
color = R.color.blade;
} else if (key.equalsIgnoreCase("C")) {
color = R.color.c;
} else if (key.equalsIgnoreCase("C#")) {
color = R.color.c_sharp;
} else if (key.equalsIgnoreCase("C++")) {
color = R.color.c_plus_plus;
} else if (key.equalsIgnoreCase("CMake")) {
color = R.color.c_make;
} else if (key.equalsIgnoreCase("COBOL")) {
color = R.color.c_make;
} else if (key.equalsIgnoreCase("CSS")) {
color = R.color.css;
} else if (key.equalsIgnoreCase("CSV")) {
color = R.color.csv;
} else if (key.equalsIgnoreCase("Checksums")) {
color = R.color.csv;
} else if (key.equalsIgnoreCase("Classic ASP")) {
color = R.color.classic_asp;
} else if (key.equalsIgnoreCase("Clojure")) {
color = R.color.clojure;
} else if (key.equalsIgnoreCase("Closure Templates")) {
color = R.color.closure_templates;
} else if (key.equalsIgnoreCase("CodeQL")) {
color = R.color.code_ql;
} else if (key.equalsIgnoreCase("CoffeeScript")) {
color = R.color.coffee_script;
} else if (key.equalsIgnoreCase("ColdFusion")) {
color = R.color.cold_fusion;
} else if (key.equalsIgnoreCase("Common Lisp")) {
color = R.color.common_lisp;
} else if (key.equalsIgnoreCase("Cython")) {
color = R.color.cython;
} else if (key.equalsIgnoreCase("DNS Zone")) {
color = R.color.cython;
} else if (key.equalsIgnoreCase("Dart")) {
color = R.color.dart;
} else if (key.equalsIgnoreCase("Diff")) {
color = R.color.dart;
} else if (key.equalsIgnoreCase("Dockerfile")) {
color = R.color.docker_file;
} else if (key.equalsIgnoreCase("Dotenv")) {
color = R.color.dot_env;
} else if (key.equalsIgnoreCase("E-mail")) {
color = R.color.dot_env;
} else if (key.equalsIgnoreCase("EJS")) {
color = R.color.ejs;
} else if (key.equalsIgnoreCase("Elixir")) {
color = R.color.elixir;
} else if (key.equalsIgnoreCase("Elm")) {
color = R.color.elm;
} else if (key.equalsIgnoreCase("Emacs Lisp")) {
color = R.color.emacs_lisp;
} else if (key.equalsIgnoreCase("EmberScript")) {
color = R.color.ember_script;
} else if (key.equalsIgnoreCase("Erlang")) {
color = R.color.erlang;
} else if (key.equalsIgnoreCase("Forth")) {
color = R.color.forth;
} else if (key.equalsIgnoreCase("Fortran")) {
color = R.color.fortran;
} else if (key.equalsIgnoreCase("Fortran Free Form")) {
color = R.color.fortran_free_form;
} else if (key.equalsIgnoreCase("FreeBasic")) {
color = R.color.free_basic;
} else if (key.equalsIgnoreCase("GDScript")) {
color = R.color.gd_script;
} else if (key.equalsIgnoreCase("GLSL")) {
color = R.color.glsl;
} else if (key.equalsIgnoreCase("Git Attributes")) {
color = R.color.git_attributes;
} else if (key.equalsIgnoreCase("Git Config")) {
color = R.color.git_config;
} else if (key.equalsIgnoreCase("Gnuplot")) {
color = R.color.gnuplot;
} else if (key.equalsIgnoreCase("Go")) {
color = R.color.go;
} else if (key.equalsIgnoreCase("Go Checksums")) {
color = R.color.go_checksums;
} else if (key.equalsIgnoreCase("Go Module")) {
color = R.color.go_module;
} else if (key.equalsIgnoreCase("Gradle")) {
color = R.color.gradle;
} else if (key.equalsIgnoreCase("GraphQL")) {
color = R.color.graph_ql;
} else if (key.equalsIgnoreCase("Groovy")) {
color = R.color.groovy;
} else if (key.equalsIgnoreCase("HAProxy")) {
color = R.color.ha_proxy;
} else if (key.equalsIgnoreCase("HCL")) {
color = R.color.hcl;
} else if (key.equalsIgnoreCase("HTML")) {
color = R.color.html;
} else if (key.equalsIgnoreCase("HTML+PHP")) {
color = R.color.html_php;
} else if (key.equalsIgnoreCase("Hack")) {
color = R.color.hack;
} else if (key.equalsIgnoreCase("Haml")) {
color = R.color.haml;
} else if (key.equalsIgnoreCase("Haskell")) {
color = R.color.haskell;
} else if (key.equalsIgnoreCase("Haxe")) {
color = R.color.haxe;
} else if (key.equalsIgnoreCase("INI")) {
color = R.color.ini;
} else if (key.equalsIgnoreCase("Ignore List")) {
color = R.color.ignore_list;
} else if (key.equalsIgnoreCase("JAR Manifest")) {
color = R.color.jar_manifest;
} else if (key.equalsIgnoreCase("JSON")) {
color = R.color.json;
} else if (key.equalsIgnoreCase("JSON with Comments")) {
color = R.color.json_with_comments;
} else if (key.equalsIgnoreCase("JSON5")) {
color = R.color.json5;
} else if (key.equalsIgnoreCase("JSONLD")) {
color = R.color.json_ld;
} else if (key.equalsIgnoreCase("JSONiq")) {
color = R.color.json_iq;
} else if (key.equalsIgnoreCase("Java")) {
color = R.color.java;
} else if (key.equalsIgnoreCase("Java Properties")) {
color = R.color.java_properties;
} else if (key.equalsIgnoreCase("Java Server Pages")) {
color = R.color.java_server_pages;
} else if (key.equalsIgnoreCase("JavaScript")) {
color = R.color.java_script;
} else if (key.equalsIgnoreCase("Jinja")) {
color = R.color.jinja;
} else if (key.equalsIgnoreCase("Julia")) {
color = R.color.julia;
} else if (key.equalsIgnoreCase("Jupyter Notebook")) {
color = R.color.jupyter_notebook;
} else if (key.equalsIgnoreCase("Kotlin")) {
color = R.color.kotlin;
} else if (key.equalsIgnoreCase("LLVM")) {
color = R.color.llvm;
} else if (key.equalsIgnoreCase("LSL")) {
color = R.color.lsl;
} else if (key.equalsIgnoreCase("Lasso")) {
color = R.color.lasso;
} else if (key.equalsIgnoreCase("Latte")) {
color = R.color.latte;
} else if (key.equalsIgnoreCase("Less")) {
color = R.color.less;
} else if (key.equalsIgnoreCase("LiveScript")) {
color = R.color.live_script;
} else if (key.equalsIgnoreCase("Lua")) {
color = R.color.lua;
} else if (key.equalsIgnoreCase("MATLAB")) {
color = R.color.matlab;
} else if (key.equalsIgnoreCase("MTML")) {
color = R.color.mtml;
} else if (key.equalsIgnoreCase("Makefile")) {
color = R.color.make_file;
} else if (key.equalsIgnoreCase("Markdown")) {
color = R.color.markdown;
} else if (key.equalsIgnoreCase("Mathematica")) {
color = R.color.mathematica;
} else if (key.equalsIgnoreCase("Maven POM")) {
color = R.color.mathematica;
} else if (key.equalsIgnoreCase("Max")) {
color = R.color.max;
} else if (key.equalsIgnoreCase("Mercury")) {
color = R.color.mercury;
} else if (key.equalsIgnoreCase("Mermaid")) {
color = R.color.mermaid;
} else if (key.equalsIgnoreCase("Meson")) {
color = R.color.meson;
} else if (key.equalsIgnoreCase("MiniYAML")) {
color = R.color.mini_yaml;
} else if (key.equalsIgnoreCase("NPM Config")) {
color = R.color.npm_rc;
} else if (key.equalsIgnoreCase("NSIS")) {
color = R.color.npm_rc;
} else if (key.equalsIgnoreCase("Nginx")) {
color = R.color.nginx;
} else if (key.equalsIgnoreCase("Nim")) {
color = R.color.nim;
} else if (key.equalsIgnoreCase("Nix")) {
color = R.color.nix;
} else if (key.equalsIgnoreCase("ObjectScript")) {
color = R.color.object_script;
} else if (key.equalsIgnoreCase("Objective-C")) {
color = R.color.objective_c;
} else if (key.equalsIgnoreCase("Objective-C++")) {
color = R.color.objective_c_plus_plus;
} else if (key.equalsIgnoreCase("PHP")) {
color = R.color.php;
} else if (key.equalsIgnoreCase("PLSQL")) {
color = R.color.pl_sql;
} else if (key.equalsIgnoreCase("PLpgSQL")) {
color = R.color.pl_pg_sql;
} else if (key.equalsIgnoreCase("Pascal")) {
color = R.color.pascal;
} else if (key.equalsIgnoreCase("Perl")) {
color = R.color.perl;
} else if (key.equalsIgnoreCase("PostCSS")) {
color = R.color.post_css;
} else if (key.equalsIgnoreCase("PostScript")) {
color = R.color.post_script;
} else if (key.equalsIgnoreCase("PowerShell")) {
color = R.color.power_shell;
} else if (key.equalsIgnoreCase("Proguard")) {
color = R.color.pro_log;
} else if (key.equalsIgnoreCase("Prolog")) {
color = R.color.pro_log;
} else if (key.equalsIgnoreCase("Public Key")) {
color = R.color.pro_log;
} else if (key.equalsIgnoreCase("Pug")) {
color = R.color.pug;
} else if (key.equalsIgnoreCase("Puppet")) {
color = R.color.puppet;
} else if (key.equalsIgnoreCase("Python")) {
color = R.color.python;
} else if (key.equalsIgnoreCase("Python console")) {
color = R.color.python;
} else if (key.equalsIgnoreCase("Python traceback")) {
color = R.color.python;
} else if (key.equalsIgnoreCase("QML")) {
color = R.color.qml;
} else if (key.equalsIgnoreCase("Qt Script")) {
color = R.color.qt_script;
} else if (key.equalsIgnoreCase("R")) {
color = R.color.r;
} else if (key.equalsIgnoreCase("Racket")) {
color = R.color.racket;
} else if (key.equalsIgnoreCase("Raku")) {
color = R.color.raku;
} else if (key.equalsIgnoreCase("Raw token data")) {
color = R.color.raku;
} else if (key.equalsIgnoreCase("Regular Expression")) {
color = R.color.regexp;
} else if (key.equalsIgnoreCase("Rich Text Format")) {
color = R.color.regexp;
} else if (key.equalsIgnoreCase("Roff")) {
color = R.color.roff;
} else if (key.equalsIgnoreCase("Roff Manpage")) {
color = R.color.hack;
} else if (key.equalsIgnoreCase("Ruby")) {
color = R.color.ruby;
} else if (key.equalsIgnoreCase("Rust")) {
color = R.color.rust;
} else if (key.equalsIgnoreCase("SCSS")) {
color = R.color.scss;
} else if (key.equalsIgnoreCase("SELinux Policy")) {
color = R.color.scss;
} else if (key.equalsIgnoreCase("SQL")) {
color = R.color.sql;
} else if (key.equalsIgnoreCase("SQLPL")) {
color = R.color.sql;
} else if (key.equalsIgnoreCase("SSH Config")) {
color = R.color.sql;
} else if (key.equalsIgnoreCase("SVG")) {
color = R.color.svg;
} else if (key.equalsIgnoreCase("Sass")) {
color = R.color.sass;
} else if (key.equalsIgnoreCase("Scala")) {
color = R.color.scala;
} else if (key.equalsIgnoreCase("Scheme")) {
color = R.color.scheme;
} else if (key.equalsIgnoreCase("Shell")) {
color = R.color.shell;
} else if (key.equalsIgnoreCase("ShellCheck Config")) {
color = R.color.scheme;
} else if (key.equalsIgnoreCase("ShellSession")) {
color = R.color.scala;
} else if (key.equalsIgnoreCase("Smarty")) {
color = R.color.smarty;
} else if (key.equalsIgnoreCase("Standard ML")) {
color = R.color.standard_ml;
} else if (key.equalsIgnoreCase("Stata")) {
color = R.color.stata;
} else if (key.equalsIgnoreCase("Stylus")) {
color = R.color.stylus;
} else if (key.equalsIgnoreCase("Svelte")) {
color = R.color.svelte;
} else if (key.equalsIgnoreCase("Swift")) {
color = R.color.swift;
} else if (key.equalsIgnoreCase("TOML")) {
color = R.color.toml;
} else if (key.equalsIgnoreCase("TSQL")) {
color = R.color.swift;
} else if (key.equalsIgnoreCase("TSV")) {
color = R.color.swift;
} else if (key.equalsIgnoreCase("TSX")) {
color = R.color.swift;
} else if (key.equalsIgnoreCase("TXL")) {
color = R.color.swift;
} else if (key.equalsIgnoreCase("Tcl")) {
color = R.color.tcl;
} else if (key.equalsIgnoreCase("TeX")) {
color = R.color.tex;
} else if (key.equalsIgnoreCase("Texinfo")) {
color = R.color.tex;
} else if (key.equalsIgnoreCase("Text")) {
color = R.color.roff;
} else if (key.equalsIgnoreCase("Twig")) {
color = R.color.twig;
} else if (key.equalsIgnoreCase("TypeScript")) {
color = R.color.type_script;
} else if (key.equalsIgnoreCase("Unity3D Asset")) {
color = R.color.unity_asset;
} else if (key.equalsIgnoreCase("VBA")) {
color = R.color.vba;
} else if (key.equalsIgnoreCase("VBScript")) {
color = R.color.vbs;
} else if (key.equalsIgnoreCase("VHDL")) {
color = R.color.vhdl;
} else if (key.equalsIgnoreCase("Vala")) {
color = R.color.vala;
} else if (key.equalsIgnoreCase("Vim Help File")) {
color = R.color.vim;
} else if (key.equalsIgnoreCase("Vim Script")) {
color = R.color.vim;
} else if (key.equalsIgnoreCase("Vim Snippet")) {
color = R.color.vb_net;
} else if (key.equalsIgnoreCase("Visual Basic .NET")) {
color = R.color.hack;
} else if (key.equalsIgnoreCase("Visual Basic 6.0")) {
color = R.color.vb6;
} else if (key.equalsIgnoreCase("Volt")) {
color = R.color.volt;
} else if (key.equalsIgnoreCase("Vue")) {
color = R.color.vue;
} else if (key.equalsIgnoreCase("WebAssembly")) {
color = R.color.web_assembly;
} else if (key.equalsIgnoreCase("Wikitext")) {
color = R.color.wiki;
} else if (key.equalsIgnoreCase("Windows Registry Entries")) {
color = R.color.win_reg_entries;
} else if (key.equalsIgnoreCase("XML")) {
color = R.color.xml;
} else if (key.equalsIgnoreCase("XML Property List")) {
color = R.color.xml_props_list;
} else if (key.equalsIgnoreCase("XQuery")) {
color = R.color.vb6;
} else if (key.equalsIgnoreCase("XS")) {
color = R.color.wiki;
} else if (key.equalsIgnoreCase("XSLT")) {
color = R.color.xslt;
} else if (key.equalsIgnoreCase("XProc")) {
color = R.color.vb6;
} else if (key.equalsIgnoreCase("YAML")) {
color = R.color.yaml;
} else if (key.equalsIgnoreCase("Zephir")) {
color = R.color.zep;
} else if (key.equalsIgnoreCase("cURL Config")) {
color = R.color.zep;
} else if (key.equalsIgnoreCase("desktop")) {
color = R.color.win_reg_entries;
} else if (key.equalsIgnoreCase("dircolors")) {
color = R.color.xslt;
} else if (key.equalsIgnoreCase("robots.txt")) {
color = R.color.yaml;
} else if (key.equalsIgnoreCase("sed")) {
color = R.color.sed;
} else if (key.equalsIgnoreCase("xBase")) {
color = R.color.x_base;
} else {
color = R.color.default_lang_color;
}
return color;
}
}

View file

@ -0,0 +1,78 @@
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.size() > 0) {
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

@ -0,0 +1,15 @@
package org.mian.gitnex.helpers.languagestatistics;
import android.annotation.SuppressLint;
/**
* @author M M Arif
*/
public class LanguageStatisticsHelper {
@SuppressLint("DefaultLocale")
public static String calculatePercentage(Long number, float total) {
float percent = number * 100f / total;
return String.format("%.1f", percent);
}
}

View file

@ -0,0 +1,10 @@
package org.mian.gitnex.helpers.languagestatistics;
/**
* @author M M Arif
*/
public class SeekbarItem {
public int color;
public float progressItemPercentage;
}

View file

@ -134,6 +134,26 @@
android:textColorLink="@color/lightBlue"
android:textSize="@dimen/dimen16sp"/>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?attr/materialCardViewElevatedStyle"
android:backgroundTint="@android:color/transparent"
app:cardElevation="@dimen/dimen0dp">
<org.mian.gitnex.helpers.languagestatistics.LanguageStatisticsBar
android:id="@+id/languages_statistic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:thumbTint="@android:color/transparent"
android:clickable="false"
android:focusable="false"
android:enabled="false"
android:progressDrawable="@android:color/transparent"
android:visibility="gone" />
</com.google.android.material.card.MaterialCardView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/dimen20dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/lang_color"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</LinearLayout>

View file

@ -76,4 +76,169 @@
<color name="gold">#e6b121</color>
<color name="five_yellow">#fdc92f</color>
<color name="five_background_grey">#f5f2f0</color>
<!-- language statistics colors -->
<color name="default_lang_color">#49da39</color>
<color name="asp_net">#9400ff</color>
<color name="ats">#1ac620</color>
<color name="action_script">#882B0F</color>
<color name="ada">#02f88c</color>
<color name="angel_script">#C7D7DC</color>
<color name="ant_build_system">#A9157E</color>
<color name="antlers">#ff269e</color>
<color name="apache_conf">#d12127</color>
<color name="apex">#1797c0</color>
<color name="apple_script">#101F1F</color>
<color name="ascii_doc">#73a0c5</color>
<color name="assembly">#6E4C13</color>
<color name="awk">#c30e9b</color>
<color name="basic">#ff0000</color>
<color name="batch_file">#C1F12E</color>
<color name="bison">#6A463F</color>
<color name="blade">#f7523f</color>
<color name="c">#555555</color>
<color name="c_sharp">#178600</color>
<color name="c_plus_plus">#f34b7d</color>
<color name="c_make">#DA3434</color>
<color name="css">#563d7c</color>
<color name="csv">#237346</color>
<color name="classic_asp">#6a40fd</color>
<color name="clojure">#db5855</color>
<color name="closure_templates">#0d948f</color>
<color name="code_ql">#140f46</color>
<color name="coffee_script">#244776</color>
<color name="cold_fusion">#ed2cd6</color>
<color name="common_lisp">#3fb68b</color>
<color name="cython">#fedf5b</color>
<color name="dart">#00B4AB</color>
<color name="docker_file">#384d54</color>
<color name="dot_env">#e5d559</color>
<color name="ejs">#a91e50</color>
<color name="elixir">#6e4a7e</color>
<color name="elm">#60B5CC</color>
<color name="emacs_lisp">#c065db</color>
<color name="ember_script">#FFF4F3</color>
<color name="erlang">#B83998</color>
<color name="forth">#341708</color>
<color name="fortran">#4d41b1</color>
<color name="fortran_free_form">#4d41b1</color>
<color name="free_basic">#141AC9</color>
<color name="gd_script">#355570</color>
<color name="glsl">#5686a5</color>
<color name="git_attributes">#F44D27</color>
<color name="git_config">#F44D27</color>
<color name="gnuplot">#f0a9f0</color>
<color name="go">#00ADD8</color>
<color name="go_checksums">#00ADD8</color>
<color name="go_module">#00ADD8</color>
<color name="gradle">#02303a</color>
<color name="graph_ql">#e10098</color>
<color name="groovy">#4298b8</color>
<color name="ha_proxy">#106da9</color>
<color name="hcl">#844FBA</color>
<color name="html">#e34c26</color>
<color name="html_php">#4f5d95</color>
<color name="hack">#878787</color>
<color name="haml">#ece2a9</color>
<color name="haskell">#5e5086</color>
<color name="haxe">#df7900</color>
<color name="ini">#d1dbe0</color>
<color name="ignore_list">#000000</color>
<color name="jar_manifest">#b07219</color>
<color name="json">#292929</color>
<color name="json_with_comments">#292929</color>
<color name="json5">#267CB9</color>
<color name="json_ld">#0c479c</color>
<color name="json_iq">#40d47e</color>
<color name="java">#b07219</color>
<color name="java_properties">#2A6277</color>
<color name="java_server_pages">#2A6277</color>
<color name="java_script">#f1e05a</color>
<color name="jinja">#a52a22</color>
<color name="julia">#a270ba</color>
<color name="jupyter_notebook">#DA5B0B</color>
<color name="kotlin">#A97BFF</color>
<color name="llvm">#185619</color>
<color name="lsl">#3d9970</color>
<color name="lasso">#999999</color>
<color name="latte">#f2a542</color>
<color name="less">#1d365d</color>
<color name="live_script">#499886</color>
<color name="lua">#000080</color>
<color name="matlab">#e16737</color>
<color name="mtml">#b7e1f4</color>
<color name="make_file">#427819</color>
<color name="markdown">#083fa1</color>
<color name="mathematica">#dd1100</color>
<color name="max">#c4a79c</color>
<color name="mercury">#ff2b2b</color>
<color name="mermaid">#ff3670</color>
<color name="meson">#007800</color>
<color name="mini_yaml">#ff1111</color>
<color name="npm_rc">#cb3837</color>
<color name="nginx">#009639</color>
<color name="nim">#ffc200</color>
<color name="nix">#7e7eff</color>
<color name="object_script">#424893</color>
<color name="objective_c">#438eff</color>
<color name="objective_c_plus_plus">#6866fb</color>
<color name="php">#4F5D95</color>
<color name="pl_sql">#dad8d8</color>
<color name="pl_pg_sql">#336790</color>
<color name="pascal">#E3F171</color>
<color name="perl">#0298c3</color>
<color name="post_css">#dc3a0c</color>
<color name="post_script">#da291c</color>
<color name="power_shell">#012456</color>
<color name="pro_log">#74283c</color>
<color name="pug">#a86454</color>
<color name="puppet">#302B6D</color>
<color name="python">#3572A5</color>
<color name="qml">#44a51c</color>
<color name="qt_script">#00b841</color>
<color name="r">#198CE7</color>
<color name="racket">#3c5caa</color>
<color name="raku">#0000fb</color>
<color name="regexp">#009a00</color>
<color name="roff">#ecdebe</color>
<color name="ruby">#701516</color>
<color name="rust">#dea584</color>
<color name="scss">#c6538c</color>
<color name="sql">#e38c00</color>
<color name="svg">#ff9900</color>
<color name="sass">#a53b70</color>
<color name="scala">#c22d40</color>
<color name="scheme">#1e4aec</color>
<color name="shell">#89e051</color>
<color name="smarty">#f0c040</color>
<color name="standard_ml">#dc566d</color>
<color name="stata">#1a5f91</color>
<color name="stylus">#ff6347</color>
<color name="svelte">#ff3e00</color>
<color name="swift">#F05138</color>
<color name="toml">#9c4221</color>
<color name="tcl">#e4cc98</color>
<color name="tex">#3D6117</color>
<color name="twig">#c1d026</color>
<color name="type_script">#3178c6</color>
<color name="unity_asset">#222c37</color>
<color name="vba">#867db1</color>
<color name="vbs">#15dcdc</color>
<color name="vhdl">#adb2cb</color>
<color name="vala">#a56de2</color>
<color name="vim">#199f4b</color>
<color name="vb_net">#945db7</color>
<color name="vb6">#2c6353</color>
<color name="volt">#1F1F1F</color>
<color name="vue">#41b883</color>
<color name="web_assembly">#04133b</color>
<color name="wiki">#fc5757</color>
<color name="win_reg_entries">#52d5ff</color>
<color name="xml">#0060ac</color>
<color name="xml_props_list">#0060ac</color>
<color name="xslt">#EB8CEB</color>
<color name="yaml">#cb171e</color>
<color name="zep">#118f9e</color>
<color name="sed">#64b970</color>
<color name="x_base">#403a40</color>
</resources>

View file

@ -797,7 +797,7 @@
<string name="newNoteContentHint">Start taking your notes here</string>
<string name="noteDateTime">Created %s</string>
<string name="noteTimeModified">Updated %s</string>
<string name="noteDeleteDialoMessage">Do you really want to delete this note?</string>
<string name="noteDeleteDialogMessage">Do you really want to delete this note?</string>
<plurals name="noteDeleteMessage">
<item quantity="one">Note deleted successfully</item>
<item quantity="other">Notes deleted successfully</item>
@ -852,4 +852,7 @@
<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>
</resources>