Commit 139bdb73 authored by M M Arif's avatar M M Arif

Merge branch 'pre-release-prepare' into 'master'

Prepare for release 1.0.0

See merge request mmarif4u/gitnex!71
parents e2305fe2 c0a00f4c
......@@ -4,12 +4,13 @@
# GitNex - Android client for Gitea
GitNex is an Android application for Gitea.
GitNex is a free, open-source Android client for Git repository management tool Gitea. Gitea is a community managed fork of Gogs, lightweight code hosting solution written in Go.
GitNex is licensed under GPLv3 License. See the LICENSE file for the full license text.
No trackers are used and source code is available here for anyone to audit.
## Downloads
[<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/) [Download APK](https://gitlab.com/mmarif4u/gitnex/releases)
[<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/) [<img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/>](https://play.google.com/store/apps/details?id=org.mian.gitnex) [Download APK](https://gitlab.com/mmarif4u/gitnex/releases)
## Note about Gitea version
Please make sure that you are on Gitea **1.6.x** stable release or later or latest commit. Below this may not work as one would expect because of the newly added objects to the API at later versions. Please consider updating your Gitea server.
......
......@@ -6,8 +6,8 @@ android {
applicationId "org.mian.gitnex"
minSdkVersion 21
targetSdkVersion 28
versionCode 19
versionName "1.0-rc6"
versionCode 22
versionName "1.0.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
......@@ -26,7 +26,7 @@ dependencies {
def lifecycle_version = "2.0.0"
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.1.0-alpha02'
implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'
implementation 'com.google.android.material:material:1.1.0-alpha04'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
......
app/src/main/app_logo-web.png

24.8 KB | W: | H:

app/src/main/app_logo-web.png

14.7 KB | W: | H:

app/src/main/app_logo-web.png
app/src/main/app_logo-web.png
app/src/main/app_logo-web.png
app/src/main/app_logo-web.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -361,7 +361,7 @@ public class CreateIssueActivity extends AppCompatActivity implements View.OnCli
@Override
public void onCancel() {
Log.d("multiSelect","Dialog cancelled");
//Log.d("multiSelect","Dialog cancelled");
}
});
......@@ -425,7 +425,7 @@ public class CreateIssueActivity extends AppCompatActivity implements View.OnCli
@Override
public void onCancel() {
Log.d("multiSelect","Dialog cancelled");
//Log.d("multiSelect","Dialog cancelled");
}
});
......
......@@ -82,7 +82,7 @@ public class CreateLabelActivity extends AppCompatActivity {
@Override
public void onColorChosen(@ColorInt int color) {
Log.i("#Hex no alpha", String.format("#%06X", (0xFFFFFF & color)));
//Log.i("#Hex no alpha", String.format("#%06X", (0xFFFFFF & color)));
colorPicker.setBackgroundColor(color);
tinyDb.putString("labelColor", String.format("#%06X", (0xFFFFFF & color)));
cp.dismiss();
......@@ -96,7 +96,7 @@ public class CreateLabelActivity extends AppCompatActivity {
int labelColor_ = Color.parseColor("#" + getIntent().getStringExtra("labelColor"));
colorPicker.setBackgroundColor(labelColor_);
tinyDb.putString("labelColorDefault", "#" + getIntent().getStringExtra("labelColor"));
Log.i("labelTitle", getIntent().getStringExtra("labelColor"));
//Log.i("labelTitle", getIntent().getStringExtra("labelColor"));
TextView toolbar_title = findViewById(R.id.toolbar_title);
toolbar_title.setText(getResources().getString(R.string.pageTitleLabelUpdate));
......@@ -159,7 +159,7 @@ public class CreateLabelActivity extends AppCompatActivity {
updateLabelColor = tinyDb.getString("labelColor");
}
Log.i("update-tag", updateLabelColor);
//Log.i("update-tag", updateLabelColor);
if(!connToInternet) {
......
......@@ -116,7 +116,7 @@ public class RepoDetailActivity extends AppCompatActivity implements RepoBottomS
TinyDB tinyDb = new TinyDB(getApplicationContext());
String repoFullName = tinyDb.getString("repoFullName");
Log.i("repoFullName", tinyDb.getString("repoFullName"));
//Log.i("repoFullName", tinyDb.getString("repoFullName"));
String[] parts = repoFullName.split("/");
String repoOwner = parts[0];
String repoName = parts[1];
......
......@@ -135,7 +135,7 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
public void onClick(View v) {
Context context = v.getContext();
Log.i("issueNumber", issueNumber.getText().toString());
//Log.i("issueNumber", issueNumber.getText().toString());
Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", issueNumber.getText());
......@@ -151,7 +151,7 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
public void onClick(View v) {
Context context = v.getContext();
Log.i("issueNumber", issueNumber.getText().toString());
//Log.i("issueNumber", issueNumber.getText().toString());
Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", issueNumber.getText());
......
......@@ -132,8 +132,11 @@ public class BranchesFragment extends Fragment {
adapter = new BranchesAdapter(getContext(), branchesListMain);
if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter);
noDataBranches.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
noDataBranches.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
......
......@@ -101,8 +101,11 @@ public class CollaboratorsFragment extends Fragment {
adapter = new CollaboratorsAdapter(getContext(), collaboratorsListMain);
if(adapter.getCount() > 0) {
mGridView.setAdapter(adapter);
noDataCollaborators.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mGridView.setAdapter(adapter);
noDataCollaborators.setVisibility(View.VISIBLE);
}
}
......
......@@ -22,6 +22,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.IssuesAdapter;
import org.mian.gitnex.clients.IssuesService;
......@@ -39,7 +40,6 @@ import java.util.List;
public class IssuesFragment extends Fragment {
private ProgressBar mProgressBar;
//private ImageView createNewIssue;
private RecyclerView recyclerView;
private List<Issues> issuesList;
private IssuesAdapter adapter;
......@@ -47,6 +47,7 @@ public class IssuesFragment extends Fragment {
private String TAG = "IssuesListFragment - ";
private Context context;
private int pageSize = 1;
private TextView noDataIssues;
@Nullable
@Override
......@@ -72,43 +73,7 @@ public class IssuesFragment extends Fragment {
issuesList = new ArrayList<>();
mProgressBar = v.findViewById(R.id.progress_bar);
//createNewIssue = v.findViewById(R.id.createNewIssue);
/*createNewIssue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), CreateIssueActivity.class);
startActivity(intent);
}
});*/
/*recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (dy > 0 && createNewIssue.isShown()) {
createNewIssue.setVisibility(View.GONE);
} else if (dy < 0 ) {
createNewIssue.setVisibility(View.VISIBLE);
}
}
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
});*/
noDataIssues = v.findViewById(R.id.noDataIssues);
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
......@@ -196,10 +161,21 @@ public class IssuesFragment extends Fragment {
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
if(response.isSuccessful()) {
assert response.body() != null;
issuesList.clear();
issuesList.addAll(response.body());
adapter.notifyDataChanged();
if(response.body().size() > 0) {
issuesList.clear();
issuesList.addAll(response.body());
adapter.notifyDataChanged();
noDataIssues.setVisibility(View.GONE);
}
else {
issuesList.clear();
adapter.notifyDataChanged();
noDataIssues.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
}
else {
......
......@@ -149,8 +149,11 @@ public class LabelsFragment extends Fragment {
adapter = new LabelsAdapter(getContext(), labelsListMain);
if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter);
noData.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
noData.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
......
......@@ -92,48 +92,6 @@ public class MilestonesFragment extends Fragment {
DividerItemDecoration.VERTICAL);
mRecyclerView.addItemDecoration(dividerItemDecoration);
//createNewMilestone = v.findViewById(R.id.createNewMilestone);
/*createNewMilestone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), NewMilestoneActivity.class);
startActivity(intent);
}
});*/
/*v.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
v.getWindowVisibleDisplayFrame(r);
int heightDiff = v.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 500) {
createNewMilestone.setVisibility(View.GONE);
}
}
});*/
/*mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (dy > 0 && createNewMilestone.isShown()) {
createNewMilestone.setVisibility(View.GONE);
} else if (dy < 0 ) {
createNewMilestone.setVisibility(View.VISIBLE);
}
}
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
});*/
mProgressBar = v.findViewById(R.id.progress_bar);
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
......@@ -198,8 +156,11 @@ public class MilestonesFragment extends Fragment {
adapter = new MilestonesAdapter(getContext(), msListMain);
if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter);
noDataMilestone.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
noDataMilestone.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
......@@ -221,7 +182,7 @@ public class MilestonesFragment extends Fragment {
if (adapter == null) {
searchItem.setVisible(false);
}
Log.i("search", "search");
//Log.i("search", "search");
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
......
......@@ -22,6 +22,7 @@ import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.MainActivity;
import org.mian.gitnex.activities.NewRepoActivity;
......@@ -45,6 +46,7 @@ public class MyRepositoriesFragment extends Fragment {
private RecyclerView mRecyclerView;
private MyReposListAdapter adapter;
private ImageView createNewRepo;
private TextView noDataMyRepo;
private String mParam1;
private String mParam2;
......@@ -89,6 +91,7 @@ public class MyRepositoriesFragment extends Fragment {
final SwipeRefreshLayout swipeRefresh = v.findViewById(R.id.pullToRefresh);
noDataMyRepo = v.findViewById(R.id.noDataMyRepo);
mProgressBar = v.findViewById(R.id.progress_bar);
mRecyclerView = v.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
......@@ -110,19 +113,6 @@ public class MyRepositoriesFragment extends Fragment {
});
/*v.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
v.getWindowVisibleDisplayFrame(r);
int heightDiff = v.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 300) {
createNewRepo.setVisibility(View.GONE);
}
}
});*/
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
......@@ -188,7 +178,15 @@ public class MyRepositoriesFragment extends Fragment {
@Override
public void onChanged(@Nullable List<UserRepositories> myReposListMain) {
adapter = new MyReposListAdapter(getContext(), myReposListMain);
mRecyclerView.setAdapter(adapter);
if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter);
noDataMyRepo.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
noDataMyRepo.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
}
});
......
......@@ -21,6 +21,7 @@ import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.MainActivity;
import org.mian.gitnex.activities.NewOrganizationActivity;
......@@ -42,6 +43,7 @@ public class OrganizationsFragment extends Fragment {
private OrganizationsListAdapter adapter;
private RecyclerView mRecyclerView;
private ImageView createNewOrganization;
private TextView noDataOrg;
@Nullable
@Override
......@@ -61,7 +63,7 @@ public class OrganizationsFragment extends Fragment {
final SwipeRefreshLayout swipeRefresh = v.findViewById(R.id.pullToRefresh);
mProgressBar = v.findViewById(R.id.progress_bar);
noDataOrg = v.findViewById(R.id.noDataOrg);
mRecyclerView = v.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
......@@ -82,19 +84,6 @@ public class OrganizationsFragment extends Fragment {
});
/*v.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
v.getWindowVisibleDisplayFrame(r);
int heightDiff = v.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 500) {
createNewOrganization.setVisibility(View.GONE);
}
}
});*/
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
......@@ -157,7 +146,15 @@ public class OrganizationsFragment extends Fragment {
@Override
public void onChanged(@Nullable List<UserOrganizations> orgsListMain) {
adapter = new OrganizationsListAdapter(getContext(), orgsListMain);
mRecyclerView.setAdapter(adapter);
if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter);
noDataOrg.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
noDataOrg.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
}
});
......
......@@ -134,8 +134,11 @@ public class ReleasesFragment extends Fragment {
adapter = new ReleasesAdapter(getContext(), releasesListMain);
if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter);
noDataReleases.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
noDataReleases.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
......
......@@ -20,6 +20,7 @@ import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.MainActivity;
import org.mian.gitnex.activities.NewRepoActivity;
......@@ -42,6 +43,7 @@ public class RepositoriesFragment extends Fragment {
private RecyclerView mRecyclerView;
private ReposListAdapter adapter;
private ImageView createNewRepo;
private TextView noDataRepo;
@Nullable
@Override
......@@ -60,6 +62,7 @@ public class RepositoriesFragment extends Fragment {
final SwipeRefreshLayout swipeRefresh = v.findViewById(R.id.pullToRefresh);
noDataRepo = v.findViewById(R.id.noDataRepo);
mProgressBar = v.findViewById(R.id.progress_bar);
mRecyclerView = v.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
......@@ -81,19 +84,6 @@ public class RepositoriesFragment extends Fragment {
});
/*v.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
v.getWindowVisibleDisplayFrame(r);
int heightDiff = v.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 500) {
createNewRepo.setVisibility(View.GONE);
}
}
});*/
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
......@@ -159,7 +149,15 @@ public class RepositoriesFragment extends Fragment {
@Override
public void onChanged(@Nullable List<UserRepositories> reposListMain) {
adapter = new ReposListAdapter(getContext(), reposListMain);
mRecyclerView.setAdapter(adapter);
if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter);
noDataRepo.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
noDataRepo.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
}
});
......
<?xml version="1.0" encoding="utf-8"?>
<vector
android:height="108dp"
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:viewportHeight="108"
android:viewportWidth="108"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#008577"
android:pathData="M0,0h108v108h-108z"/>
<path android:fillColor="#00000000" android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
android:height="108dp"
android:viewportWidth="135.47"
android:viewportHeight="135.47">
<path
android:pathData="M68.02,66.305m-94.784,-6.397a94.999,94.999 48.861,1 1,189.567 12.793a94.999,94.999 48.861,1 1,-189.567 -12.793"
android:strokeWidth="1.40255427"
android:fillColor="#39404a"/>
<path
android:pathData="M31.738,45.193a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M31.875,115.115a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M61.361,80.42a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M34.37,18.911l7.038,0.003l-0.096,85.655l-7.038,-0.003z"
android:fillColor="#609926"/>
<path
android:pathData="m37.878,38.707c31.743,0.128 29.614,-4.427 29.723,36.496"
android:strokeWidth="8.72550011"
android:fillColor="#00000000"
android:strokeColor="#609926"/>
<path
android:pathData="m97.323,109.027c-31.743,-0.128 -29.614,4.427 -29.723,-36.496"
android:strokeWidth="8.72550011"
android:fillColor="#00000000"
android:strokeColor="#609926"/>
<path
android:pathData="M90.959,45.193a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M90.955,115.117a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M93.872,35.636l7.038,0.002l-0.096,68.927l-7.038,-0.002z"
android:fillColor="#609926"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="199.22058"
android:viewportHeight="199.22058">
<group android:translateX="31.875294"
android:translateY="31.875294">
android:viewportWidth="208.41539"
android:viewportHeight="208.41539">
<group android:translateX="36.47269"
android:translateY="36.47269">
<path
android:pathData="M67.733,67.74m-67.733,0a67.733,67.733 0,1 1,135.466 0a67.733,67.733 0,1 1,-135.466 0"
android:pathData="M68.02,66.305m-94.784,-6.397a94.999,94.999 48.861,1 1,189.567 12.793a94.999,94.999 48.861,1 1,-189.567 -12.793"
android:strokeWidth="1.40255427"
android:fillColor="#39404a"/>
<path
android:pathData="M31.738,44.619a9.139,9.151 63.874,1 0,12.769 -13.108a9.139,9.151 63.874,1 0,-12.769 13.108z"
android:pathData="M31.738,45.193a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M31.875,114.541a9.139,9.151 63.874,1 0,12.769 -13.108a9.139,9.151 63.874,1 0,-12.769 13.108z"
android:pathData="M31.875,115.115a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M61.361,79.846a9.139,9.151 63.874,1 0,12.769 -13.108a9.139,9.151 63.874,1 0,-12.769 13.108z"
android:pathData="M61.361,80.42a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M34.37,18.337l7.038,0.003l-0.096,85.655l-7.038,-0.003z"
android:pathData="M34.37,18.911l7.038,0.003l-0.096,85.655l-7.038,-0.003z"
android:fillColor="#609926"/>
<path
android:pathData="m37.878,38.133c31.743,0.128 29.614,-4.427 29.723,36.496"
android:strokeWidth="8.7255"
android:pathData="m37.878,38.707c31.743,0.128 29.614,-4.427 29.723,36.496"
android:strokeWidth="8.72550011"
android:fillColor="#00000000"
android:strokeColor="#609926"/>
<path
android:pathData="m97.323,108.453c-31.743,-0.128 -29.614,4.427 -29.723,-36.496"
android:strokeWidth="8.7255"
android:pathData="m97.323,109.027c-31.743,-0.128 -29.614,4.427 -29.723,-36.496"
android:strokeWidth="8.72550011"
android:fillColor="#00000000"
android:strokeColor="#609926"/>
<path
android:pathData="M90.959,44.619a9.139,9.151 63.874,1 0,12.769 -13.108a9.139,9.151 63.874,1 0,-12.769 13.108z"
android:pathData="M90.959,45.193a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M90.955,114.542a9.139,9.151 63.874,1 0,12.769 -13.108a9.139,9.151 63.874,1 0,-12.769 13.108z"
android:pathData="M90.955,115.117a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M93.872,35.062l7.038,0.002l-0.096,68.927l-7.038,-0.002z"