Draw charts
This commit is contained in:
parent
4c8945811f
commit
237b77d085
|
@ -17,70 +17,44 @@ package app.fedilab.android.activities;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.DatePickerDialog;
|
import android.app.DatePickerDialog;
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.DatePicker;
|
import android.widget.DatePicker;
|
||||||
import android.widget.EditText;
|
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.RelativeLayout;
|
|
||||||
import android.widget.ScrollView;
|
|
||||||
import android.widget.Spinner;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
|
||||||
|
|
||||||
import com.github.mikephil.charting.charts.LineChart;
|
import com.github.mikephil.charting.charts.LineChart;
|
||||||
|
import com.github.mikephil.charting.components.XAxis;
|
||||||
import java.text.DecimalFormat;
|
import com.github.mikephil.charting.data.Entry;
|
||||||
|
import com.github.mikephil.charting.data.LineData;
|
||||||
|
import com.github.mikephil.charting.data.LineDataSet;
|
||||||
|
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import app.fedilab.android.R;
|
import app.fedilab.android.R;
|
||||||
import app.fedilab.android.asynctasks.RetrieveChartsAsyncTask;
|
import app.fedilab.android.asynctasks.RetrieveChartsAsyncTask;
|
||||||
import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask;
|
|
||||||
import app.fedilab.android.asynctasks.RetrieveStatsAsyncTask;
|
|
||||||
import app.fedilab.android.client.APIResponse;
|
|
||||||
import app.fedilab.android.client.Entities.Account;
|
import app.fedilab.android.client.Entities.Account;
|
||||||
import app.fedilab.android.client.Entities.Charts;
|
import app.fedilab.android.client.Entities.Charts;
|
||||||
import app.fedilab.android.client.Entities.Statistics;
|
|
||||||
import app.fedilab.android.client.Entities.Status;
|
|
||||||
import app.fedilab.android.drawers.StatusListAdapter;
|
|
||||||
import app.fedilab.android.helper.FilterToots;
|
|
||||||
import app.fedilab.android.helper.Helper;
|
import app.fedilab.android.helper.Helper;
|
||||||
import app.fedilab.android.interfaces.OnRetrieveChartsInterface;
|
import app.fedilab.android.interfaces.OnRetrieveChartsInterface;
|
||||||
import app.fedilab.android.interfaces.OnRetrieveFeedsInterface;
|
|
||||||
import app.fedilab.android.interfaces.OnRetrieveStatsInterface;
|
|
||||||
import app.fedilab.android.services.BackupStatusInDataBaseService;
|
|
||||||
import app.fedilab.android.sqlite.AccountDAO;
|
import app.fedilab.android.sqlite.AccountDAO;
|
||||||
import app.fedilab.android.sqlite.Sqlite;
|
import app.fedilab.android.sqlite.Sqlite;
|
||||||
import app.fedilab.android.sqlite.StatusCacheDAO;
|
import app.fedilab.android.sqlite.StatusCacheDAO;
|
||||||
import es.dmoral.toasty.Toasty;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -92,7 +66,6 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart
|
||||||
|
|
||||||
|
|
||||||
LinearLayoutManager mLayoutManager;
|
LinearLayoutManager mLayoutManager;
|
||||||
private int style;
|
|
||||||
private Button settings_time_from, settings_time_to;
|
private Button settings_time_from, settings_time_to;
|
||||||
private Date dateIni, dateEnd;
|
private Date dateIni, dateEnd;
|
||||||
private LineChart chart;
|
private LineChart chart;
|
||||||
|
@ -131,15 +104,19 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart
|
||||||
actionBar.setCustomView(view, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
actionBar.setCustomView(view, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||||
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
|
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
|
||||||
|
|
||||||
ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_toot);
|
ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_conversation);
|
||||||
close_toot.setOnClickListener(new View.OnClickListener() {
|
close_toot.setOnClickListener(v -> finish());
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
TextView toolbarTitle = actionBar.getCustomView().findViewById(R.id.toolbar_title);
|
TextView toolbarTitle = actionBar.getCustomView().findViewById(R.id.toolbar_title);
|
||||||
ImageView pp_actionBar = actionBar.getCustomView().findViewById(R.id.pp_actionBar);
|
ImageView pp_actionBar = actionBar.getCustomView().findViewById(R.id.pp_actionBar);
|
||||||
|
SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||||
|
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
|
||||||
|
String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, null);
|
||||||
|
Account account = new AccountDAO(getApplicationContext(),db).getUniqAccount(userId, instance);
|
||||||
|
String url = account.getAvatar();
|
||||||
|
if( url.startsWith("/") ){
|
||||||
|
url = Helper.getLiveInstanceWithProtocol(getApplicationContext()) + account.getAvatar();
|
||||||
|
}
|
||||||
|
Helper.loadGiF(getApplicationContext(), url, pp_actionBar);
|
||||||
if (theme == Helper.THEME_LIGHT){
|
if (theme == Helper.THEME_LIGHT){
|
||||||
Helper.colorizeToolbar(actionBar.getCustomView().findViewById(R.id.toolbar), R.color.black, OwnerChartsActivity.this);
|
Helper.colorizeToolbar(actionBar.getCustomView().findViewById(R.id.toolbar), R.color.black, OwnerChartsActivity.this);
|
||||||
}
|
}
|
||||||
|
@ -150,17 +127,19 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart
|
||||||
chart = findViewById(R.id.chart);
|
chart = findViewById(R.id.chart);
|
||||||
settings_time_from = findViewById(R.id.settings_time_from);
|
settings_time_from = findViewById(R.id.settings_time_from);
|
||||||
settings_time_to = findViewById(R.id.settings_time_to);
|
settings_time_to = findViewById(R.id.settings_time_to);
|
||||||
if( theme == Helper.THEME_DARK){
|
|
||||||
style = R.style.DialogDark;
|
|
||||||
}else if( theme == Helper.THEME_BLACK){
|
|
||||||
style = R.style.DialogBlack;
|
|
||||||
}else {
|
|
||||||
style = R.style.Dialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
SQLiteDatabase db = Sqlite.getInstance(OwnerChartsActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
SQLiteDatabase db = Sqlite.getInstance(OwnerChartsActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||||
dateIni = new StatusCacheDAO(OwnerChartsActivity.this, db).getSmallerDate(StatusCacheDAO.ARCHIVE_CACHE);
|
dateIni = new StatusCacheDAO(OwnerChartsActivity.this, db).getSmallerDate(StatusCacheDAO.ARCHIVE_CACHE);
|
||||||
dateEnd = new StatusCacheDAO(OwnerChartsActivity.this, db).getGreaterDate(StatusCacheDAO.ARCHIVE_CACHE);
|
dateEnd = new StatusCacheDAO(OwnerChartsActivity.this, db).getGreaterDate(StatusCacheDAO.ARCHIVE_CACHE);
|
||||||
|
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.setTime(dateEnd);
|
||||||
|
cal.add(Calendar.MONTH, -1);
|
||||||
|
Date result = cal.getTime();
|
||||||
|
if( result.after(dateIni))
|
||||||
|
dateIni = result;
|
||||||
|
|
||||||
if(dateIni == null){
|
if(dateIni == null){
|
||||||
dateIni = new Date();
|
dateIni = new Date();
|
||||||
}
|
}
|
||||||
|
@ -228,5 +207,63 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart
|
||||||
@Override
|
@Override
|
||||||
public void onCharts(Charts charts) {
|
public void onCharts(Charts charts) {
|
||||||
|
|
||||||
|
List<Entry> boostsEntry = new ArrayList<>();
|
||||||
|
int i = 0;
|
||||||
|
for (int boost : charts.getBoosts()) {
|
||||||
|
boostsEntry.add(new Entry(charts.getxValues().get(i), boost));
|
||||||
|
Log.v(Helper.TAG,"boost: " + boost);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
Log.v(Helper.TAG,"boostsEntry: " + boostsEntry.size());
|
||||||
|
|
||||||
|
List<Entry> repliesEntry = new ArrayList<>();
|
||||||
|
i = 0;
|
||||||
|
for (int reply : charts.getReplies()) {
|
||||||
|
repliesEntry.add(new Entry(charts.getxValues().get(i), reply));
|
||||||
|
Log.v(Helper.TAG,"reply: " + reply);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
Log.v(Helper.TAG,"repliesEntry: " + repliesEntry.size());
|
||||||
|
List<Entry> statusesEntry = new ArrayList<>();
|
||||||
|
i = 0;
|
||||||
|
for (int status : charts.getStatuses()) {
|
||||||
|
statusesEntry.add(new Entry(charts.getxValues().get(i), status));
|
||||||
|
Log.v(Helper.TAG,"status: " + status);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
Log.v(Helper.TAG,"statusesEntry: " + statusesEntry.size());
|
||||||
|
LineDataSet dataSetBoosts = new LineDataSet(boostsEntry, getString(R.string.reblog));
|
||||||
|
dataSetBoosts.setColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_boost));
|
||||||
|
dataSetBoosts.setValueTextColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_boost));
|
||||||
|
|
||||||
|
LineDataSet dateSetReplies = new LineDataSet(repliesEntry, getString(R.string.replies));
|
||||||
|
dataSetBoosts.setColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_reply));
|
||||||
|
dataSetBoosts.setValueTextColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_reply));
|
||||||
|
|
||||||
|
LineDataSet dataSetStatuses = new LineDataSet(statusesEntry, getString(R.string.statuses));
|
||||||
|
dataSetBoosts.setColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_status));
|
||||||
|
dataSetBoosts.setValueTextColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_status));
|
||||||
|
|
||||||
|
List<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
|
||||||
|
|
||||||
|
|
||||||
|
dataSets.add(dataSetBoosts);
|
||||||
|
dataSets.add(dateSetReplies);
|
||||||
|
dataSets.add(dataSetStatuses);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
XAxis xAxis = chart.getXAxis();
|
||||||
|
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
|
||||||
|
xAxis.setTextSize(10f);
|
||||||
|
xAxis.setLabelRotationAngle(45);
|
||||||
|
//xAxis.setTextColor(Color.RED);
|
||||||
|
xAxis.setDrawAxisLine(true);
|
||||||
|
xAxis.setDrawGridLines(false);
|
||||||
|
|
||||||
|
LineData data = new LineData(dataSets);
|
||||||
|
chart.setData(data);
|
||||||
|
|
||||||
|
chart.invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -547,6 +547,12 @@ public class OwnerStatusActivity extends BaseActivity implements OnRetrieveFeeds
|
||||||
TextView first_toot_date = statsDialogView.findViewById(R.id.first_toot_date);
|
TextView first_toot_date = statsDialogView.findViewById(R.id.first_toot_date);
|
||||||
TextView tags = statsDialogView.findViewById(R.id.tags);
|
TextView tags = statsDialogView.findViewById(R.id.tags);
|
||||||
|
|
||||||
|
Button charts = statsDialogView.findViewById(R.id.charts);
|
||||||
|
charts.setOnClickListener(w ->{
|
||||||
|
Intent intent = new Intent(OwnerStatusActivity.this, OwnerChartsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
total_statuses.setText(String.valueOf(statistics.getTotal_statuses()));
|
total_statuses.setText(String.valueOf(statistics.getTotal_statuses()));
|
||||||
number_boosts.setText(String.valueOf(statistics.getNumber_boosts()));
|
number_boosts.setText(String.valueOf(statistics.getNumber_boosts()));
|
||||||
number_replies.setText(String.valueOf(statistics.getNumber_replies()));
|
number_replies.setText(String.valueOf(statistics.getNumber_replies()));
|
||||||
|
|
|
@ -19,8 +19,6 @@ import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -443,17 +441,16 @@ public class StatusCacheDAO {
|
||||||
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
|
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
|
||||||
String instance = Helper.getLiveInstance(context);
|
String instance = Helper.getLiveInstance(context);
|
||||||
Charts charts = new Charts();
|
Charts charts = new Charts();
|
||||||
dateIni = new Date(dateIni.getYear(), dateIni.getMonth(), dateIni.getDay(), 0, 0, 0);
|
|
||||||
|
|
||||||
Calendar start = Calendar.getInstance();
|
Calendar start = Calendar.getInstance();
|
||||||
start.setTime(dateIni);
|
start.setTime(dateIni);
|
||||||
start.set(Calendar.HOUR,0);
|
start.set(Calendar.HOUR_OF_DAY,0);
|
||||||
start.set(Calendar.MINUTE,0);
|
start.set(Calendar.MINUTE,0);
|
||||||
start.set(Calendar.SECOND,0);
|
start.set(Calendar.SECOND,0);
|
||||||
|
|
||||||
Calendar end = Calendar.getInstance();
|
Calendar end = Calendar.getInstance();
|
||||||
end.setTime(dateEnd);
|
end.setTime(dateEnd);
|
||||||
end.set(Calendar.HOUR,23);
|
end.set(Calendar.HOUR_OF_DAY,23);
|
||||||
end.set(Calendar.MINUTE,59);
|
end.set(Calendar.MINUTE,59);
|
||||||
end.set(Calendar.SECOND,59);
|
end.set(Calendar.SECOND,59);
|
||||||
|
|
||||||
|
@ -477,7 +474,7 @@ public class StatusCacheDAO {
|
||||||
if( data != null && data.size() > 0) {
|
if( data != null && data.size() > 0) {
|
||||||
while (!start.after(end)) {
|
while (!start.after(end)) {
|
||||||
Date targetDay = start.getTime();
|
Date targetDay = start.getTime();
|
||||||
Date dateLimite = new Date(targetDay.getTime() - TimeUnit.DAYS.toMillis(1));
|
Date dateLimite = new Date(targetDay.getTime() + TimeUnit.DAYS.toMillis(1));
|
||||||
xLabel.add(Helper.shortDateToString(targetDay));
|
xLabel.add(Helper.shortDateToString(targetDay));
|
||||||
xValues.add(inc);
|
xValues.add(inc);
|
||||||
int boostsCount = 0;
|
int boostsCount = 0;
|
||||||
|
@ -492,15 +489,13 @@ public class StatusCacheDAO {
|
||||||
}else {
|
}else {
|
||||||
statusesCount++;
|
statusesCount++;
|
||||||
}
|
}
|
||||||
}else{
|
|
||||||
inc++;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
boosts.add(boostsCount);
|
boosts.add(boostsCount);
|
||||||
replies.add(repliesCount);
|
replies.add(repliesCount);
|
||||||
statuses.add(statusesCount);
|
statuses.add(statusesCount);
|
||||||
start.add(Calendar.DATE, 1);
|
start.add(Calendar.DATE, 1);
|
||||||
|
inc++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
charts.setxLabels(xLabel);
|
charts.setxLabels(xLabel);
|
||||||
|
|
|
@ -33,6 +33,12 @@
|
||||||
android:paddingEnd="@dimen/activity_vertical_margin"
|
android:paddingEnd="@dimen/activity_vertical_margin"
|
||||||
android:paddingRight="@dimen/activity_vertical_margin"
|
android:paddingRight="@dimen/activity_vertical_margin"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
|
<Button
|
||||||
|
android:id="@+id/charts"
|
||||||
|
android:text="@string/display_charts"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_marginTop="20dp"
|
android:layout_marginTop="20dp"
|
||||||
|
|
|
@ -152,4 +152,11 @@
|
||||||
<color name="quick_reply_background_dark">#2d313c</color>
|
<color name="quick_reply_background_dark">#2d313c</color>
|
||||||
<color name="quick_reply_background_black">#1A1A1A</color>
|
<color name="quick_reply_background_black">#1A1A1A</color>
|
||||||
<color name="quick_reply_background_light">#E0E0E0</color>
|
<color name="quick_reply_background_light">#E0E0E0</color>
|
||||||
|
|
||||||
|
|
||||||
|
<color name="chart_boost">#7B1FA2</color>
|
||||||
|
<color name="chart_reply">#0097A7</color>
|
||||||
|
<color name="chart_status">#1976D2</color>
|
||||||
|
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1141,6 +1141,7 @@
|
||||||
<string name="no_messages">No groups!</string>
|
<string name="no_messages">No groups!</string>
|
||||||
<string name="set_disable_animated_emoji">Disable custom animated emojis</string>
|
<string name="set_disable_animated_emoji">Disable custom animated emojis</string>
|
||||||
<string name="owner_charts">Charts</string>
|
<string name="owner_charts">Charts</string>
|
||||||
|
<string name="display_charts">Display charts</string>
|
||||||
<plurals name="number_of_vote">
|
<plurals name="number_of_vote">
|
||||||
<item quantity="one">%d vote</item>
|
<item quantity="one">%d vote</item>
|
||||||
<item quantity="other">%d votes</item>
|
<item quantity="other">%d votes</item>
|
||||||
|
|
Loading…
Reference in New Issue