From 237b77d085c0a21dca0228f69cc91c141027ba64 Mon Sep 17 00:00:00 2001 From: tom79 Date: Sun, 28 Jul 2019 18:13:39 +0200 Subject: [PATCH] Draw charts --- .../activities/OwnerChartsActivity.java | 133 +++++++++++------- .../activities/OwnerStatusActivity.java | 6 + .../android/sqlite/StatusCacheDAO.java | 13 +- app/src/main/res/layout/stats_owner_toots.xml | 6 + app/src/main/res/values/colors.xml | 7 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 109 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/activities/OwnerChartsActivity.java b/app/src/main/java/app/fedilab/android/activities/OwnerChartsActivity.java index 798871823..c0d883bd0 100644 --- a/app/src/main/java/app/fedilab/android/activities/OwnerChartsActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/OwnerChartsActivity.java @@ -17,70 +17,44 @@ package app.fedilab.android.activities; import android.annotation.SuppressLint; import android.app.DatePickerDialog; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; -import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import android.widget.CheckBox; import android.widget.DatePicker; -import android.widget.EditText; import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.ScrollView; -import android.widget.Spinner; import android.widget.TextView; -import android.widget.Toast; - import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; - import com.github.mikephil.charting.charts.LineChart; - -import java.text.DecimalFormat; +import com.github.mikephil.charting.components.XAxis; +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.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.List; -import java.util.Map; - import app.fedilab.android.R; 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.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.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.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; -import es.dmoral.toasty.Toasty; + /** @@ -92,7 +66,6 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart LinearLayoutManager mLayoutManager; - private int style; private Button settings_time_from, settings_time_to; private Date dateIni, dateEnd; 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.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); - ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_toot); - close_toot.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); + ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_conversation); + close_toot.setOnClickListener(v -> finish()); TextView toolbarTitle = actionBar.getCustomView().findViewById(R.id.toolbar_title); 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){ 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); settings_time_from = findViewById(R.id.settings_time_from); 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(); dateIni = new StatusCacheDAO(OwnerChartsActivity.this, db).getSmallerDate(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){ dateIni = new Date(); } @@ -228,5 +207,63 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart @Override public void onCharts(Charts charts) { + List 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 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 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 dataSets = new ArrayList(); + + + 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(); } } diff --git a/app/src/main/java/app/fedilab/android/activities/OwnerStatusActivity.java b/app/src/main/java/app/fedilab/android/activities/OwnerStatusActivity.java index db9b13605..2cd53c3c2 100644 --- a/app/src/main/java/app/fedilab/android/activities/OwnerStatusActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/OwnerStatusActivity.java @@ -547,6 +547,12 @@ public class OwnerStatusActivity extends BaseActivity implements OnRetrieveFeeds TextView first_toot_date = statsDialogView.findViewById(R.id.first_toot_date); 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())); number_boosts.setText(String.valueOf(statistics.getNumber_boosts())); number_replies.setText(String.valueOf(statistics.getNumber_replies())); diff --git a/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java b/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java index 1436f709a..6d7049937 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java @@ -19,8 +19,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; - -import java.time.LocalDate; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -443,17 +441,16 @@ public class StatusCacheDAO { String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); String instance = Helper.getLiveInstance(context); Charts charts = new Charts(); - dateIni = new Date(dateIni.getYear(), dateIni.getMonth(), dateIni.getDay(), 0, 0, 0); Calendar start = Calendar.getInstance(); start.setTime(dateIni); - start.set(Calendar.HOUR,0); + start.set(Calendar.HOUR_OF_DAY,0); start.set(Calendar.MINUTE,0); start.set(Calendar.SECOND,0); Calendar end = Calendar.getInstance(); end.setTime(dateEnd); - end.set(Calendar.HOUR,23); + end.set(Calendar.HOUR_OF_DAY,23); end.set(Calendar.MINUTE,59); end.set(Calendar.SECOND,59); @@ -477,7 +474,7 @@ public class StatusCacheDAO { if( data != null && data.size() > 0) { while (!start.after(end)) { 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)); xValues.add(inc); int boostsCount = 0; @@ -492,15 +489,13 @@ public class StatusCacheDAO { }else { statusesCount++; } - }else{ - inc++; - break; } } boosts.add(boostsCount); replies.add(repliesCount); statuses.add(statusesCount); start.add(Calendar.DATE, 1); + inc++; } } charts.setxLabels(xLabel); diff --git a/app/src/main/res/layout/stats_owner_toots.xml b/app/src/main/res/layout/stats_owner_toots.xml index 5d186646e..4fda9f7e7 100644 --- a/app/src/main/res/layout/stats_owner_toots.xml +++ b/app/src/main/res/layout/stats_owner_toots.xml @@ -33,6 +33,12 @@ android:paddingEnd="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_vertical_margin" android:layout_height="wrap_content"> +