From 1126381a612db311fdaa3e8ef2a587ca3e0457b2 Mon Sep 17 00:00:00 2001 From: kartikeysaran Date: Fri, 29 Jan 2021 17:22:37 +0530 Subject: [PATCH] Added Logged Data Widget Solves Issue #2068 --- app/src/main/AndroidManifest.xml | 10 ++ .../widgets/loggedData/LoggedDataWidget.java | 29 ++++ .../widgets/loggedData/logDataWidgetList.java | 155 ++++++++++++++++++ .../loggedData/logDataWidgetService.java | 13 ++ .../example_appwidget_preview.png | Bin 0 -> 3522 bytes .../main/res/layout/logged_data_widget.xml | 29 ++++ app/src/main/res/values-v14/dimens.xml | 10 ++ app/src/main/res/values/dimens.xml | 8 +- app/src/main/res/values/strings.xml | 8 +- .../main/res/xml/logged_data_widget_info.xml | 10 ++ 10 files changed, 265 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/io/pslab/widgets/loggedData/LoggedDataWidget.java create mode 100644 app/src/main/java/io/pslab/widgets/loggedData/logDataWidgetList.java create mode 100644 app/src/main/java/io/pslab/widgets/loggedData/logDataWidgetService.java create mode 100644 app/src/main/res/drawable-nodpi/example_appwidget_preview.png create mode 100644 app/src/main/res/layout/logged_data_widget.xml create mode 100644 app/src/main/res/values-v14/dimens.xml create mode 100644 app/src/main/res/xml/logged_data_widget_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d2efd4b3..4ea75dfb1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,16 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:replace="android:icon"> + + + + + + + + diff --git a/app/src/main/java/io/pslab/widgets/loggedData/LoggedDataWidget.java b/app/src/main/java/io/pslab/widgets/loggedData/LoggedDataWidget.java new file mode 100644 index 000000000..9659d5a22 --- /dev/null +++ b/app/src/main/java/io/pslab/widgets/loggedData/LoggedDataWidget.java @@ -0,0 +1,29 @@ +package io.pslab.widgets.loggedData; + +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.widget.RemoteViews; + +import io.pslab.R; +import io.pslab.activity.DataLoggerActivity; + +public class LoggedDataWidget extends AppWidgetProvider { + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + for (int i = 0; i < appWidgetIds.length; i++) { + Intent intent = new Intent(context, logDataWidgetService.class); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); + intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); + RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.logged_data_widget); + rv.setRemoteAdapter(android.R.id.list, intent); + rv.setEmptyView(android.R.id.list, R.id.data_logger_list_view); + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + } + + super.onUpdate(context, appWidgetManager, appWidgetIds); + } +} + diff --git a/app/src/main/java/io/pslab/widgets/loggedData/logDataWidgetList.java b/app/src/main/java/io/pslab/widgets/loggedData/logDataWidgetList.java new file mode 100644 index 000000000..6044e3876 --- /dev/null +++ b/app/src/main/java/io/pslab/widgets/loggedData/logDataWidgetList.java @@ -0,0 +1,155 @@ +package io.pslab.widgets.loggedData; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import android.content.Context; +import android.content.Intent; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import io.pslab.R; +import io.pslab.adapters.SensorLoggerListAdapter; +import io.pslab.models.PSLabSensor; +import io.pslab.models.SensorDataBlock; +import io.pslab.others.CSVLogger; +import io.pslab.others.LocalDataLog; +import io.realm.Realm; +import io.realm.RealmResults; + +public class logDataWidgetList implements RemoteViewsService.RemoteViewsFactory { + + private List results = new ArrayList<>(); + private Context context; + private RealmResults entities; + private Realm realm; +// private int appWidgetId; + + public logDataWidgetList(Context context, Intent intent) { + + this.context = context; +// appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + } + + @Override + public void onCreate() { + refreshEntities(); + } + + private void refreshEntities() { + realm = LocalDataLog.with().getRealm(); + entities = LocalDataLog.with().getAllSensorBlocks(); + } + + @Override + public RemoteViews getViewAt(int position) { + final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.logger_data_item); + final SensorDataBlock block = entities.get(position); + assert block!=null; + switch (block.getSensorType()) { + case PSLabSensor.LUXMETER: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.lux_meter)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_lux_meter_log); + break; + case PSLabSensor.BAROMETER: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.baro_meter)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_barometer_log); + break; + case PSLabSensor.GYROSCOPE: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.gyroscope)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.gyroscope_logo); + break; + case PSLabSensor.COMPASS: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.gyroscope)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.gyroscope_logo); + break; + case PSLabSensor.ACCELEROMETER: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.accelerometer)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_accelerometer); + break; + case PSLabSensor.THERMOMETER: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.thermometer)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.thermometer_logo); + break; + case PSLabSensor.ROBOTIC_ARM: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.robotic_arm)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.robotic_arm); + break; + case PSLabSensor.WAVE_GENERATOR: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.wave_generator)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_wave_generator); + break; + case PSLabSensor.OSCILLOSCOPE: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.oscilloscope)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_oscilloscope); + break; + case PSLabSensor.POWER_SOURCE: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.power_source)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_power_source); + break; + case PSLabSensor.MULTIMETER: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.multimeter)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_multimeter); + break; + case PSLabSensor.LOGIC_ANALYZER: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.logical_analyzer)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_logic_analyzer); + break; + case PSLabSensor.GAS_SENSOR: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.gas_sensor)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_gas); + break; + case PSLabSensor.SOUND_METER: + remoteViews.setTextViewText(R.id.sensor_name,context.getResources().getString(R.string.sound_meter)); + remoteViews.setImageViewResource(R.id.sensor_tile_icon,R.drawable.tile_icon_gas); + break; + default: + break; + } + remoteViews.setTextViewText(R.id.date_time,String.valueOf(CSVLogger.FILE_NAME_FORMAT.format(new Date(block.getBlock())))); + return remoteViews; + } + + @Override + public RemoteViews getLoadingView() { + return null; + } + + @Override + public int getCount() { + + return entities.size(); + } + + @Override + public long getItemId(int position) { + + return position; + } + + @Override + public void onDataSetChanged() { + + refreshEntities(); + } + + @Override + public void onDestroy() { } + + + @Override + public int getViewTypeCount() { + + return 1; + } + + @Override + public boolean hasStableIds() { + + return false; + } +} diff --git a/app/src/main/java/io/pslab/widgets/loggedData/logDataWidgetService.java b/app/src/main/java/io/pslab/widgets/loggedData/logDataWidgetService.java new file mode 100644 index 000000000..c40cbefa2 --- /dev/null +++ b/app/src/main/java/io/pslab/widgets/loggedData/logDataWidgetService.java @@ -0,0 +1,13 @@ +package io.pslab.widgets.loggedData; + +import android.content.Intent; +import android.widget.RemoteViewsService; + +public class logDataWidgetService extends RemoteViewsService { + + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + + return new logDataWidgetList(getApplicationContext(), intent); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-nodpi/example_appwidget_preview.png b/app/src/main/res/drawable-nodpi/example_appwidget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..894b069a4907d258f60b1b2406b90f5a0fe1c35b GIT binary patch literal 3522 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 + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v14/dimens.xml b/app/src/main/res/values-v14/dimens.xml new file mode 100644 index 000000000..4db8c5906 --- /dev/null +++ b/app/src/main/res/values-v14/dimens.xml @@ -0,0 +1,10 @@ + + + + + 0dp + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index cf20b6211..90310148d 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -136,7 +136,7 @@ 0dp 192dp 190dp - + 173dp 167dp 176dp @@ -396,4 +396,10 @@ 8sp 16sp 0dp + + + 8dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 51d305800..ab63c20f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,10 +2,8 @@ PSLab open_drawer close_drawer - Press again to close PSLab "The sensor required for this instrument is not present in your device" - Connect Device Instruments Settings @@ -1031,14 +1029,12 @@ 0 1 - Google Map OpenStreetMap Location not specified 0 Unknown Rate App - Sound Meter To measure the loudness in the environment in decibel(dB) Sound meter Introduction @@ -1048,12 +1044,12 @@ Avg (dB) Sound Level(dB) This feature is in progress - Developers https://github.com/fossasia/pslab-android/graphs/contributors \"Dangerous\" Average - No Logged Data Found + EXAMPLE + Add widget diff --git a/app/src/main/res/xml/logged_data_widget_info.xml b/app/src/main/res/xml/logged_data_widget_info.xml new file mode 100644 index 000000000..1c888b625 --- /dev/null +++ b/app/src/main/res/xml/logged_data_widget_info.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file