В настоящее время я создаю приложение, которое обрабатывает растения дома как мой школьный проект.
Приложение отображает раздел ежедневных задач (полив, удобрение), который я также отображаю в виджете коллекции.
Теперь, если пользователь щелкает строку в виджете, я хотел бы обновить свое растение и отметить его как полив или удобрение. Для этого мне нужно изменить один из атрибутов моего объекта, а затем отправить его в базу данных. Возможно ли это, или вы можете открыть действия только из виджета?
Вот мой код:
package ie.dbs.myplants;
import android.content.Intent;
import android.widget.RemoteViewsService;
public class WidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new DataProvider(this, intent);
}
}
package ie.dbs.myplants;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
import androidx.annotation.NonNull;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.ValueEventListener;
/**
* Implementation of App Widget functionality.
*/
public class NewAppWidget extends AppWidgetProvider {
private Plant myPlant;
private String plantID;
private String task;
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
CharSequence widgetText = context.getString(R.string.appwidget_text);
// Construct the RemoteViews object
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
setRemoteAdapter(context, views);
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
if (plantID != null) {
final String userID = Utils.user.getUid();
final DatabaseReference plantListRef = Utils.databaseReference.child("users").child(userID).child("plants").child(plantID);
plantListRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot plantSnapshot : dataSnapshot.getChildren()) {
myPlant = dataSnapshot.getValue(Plant.class);
}
if(task.equals("fertilizing")){
if (myPlant.isTaskFertilizinChecked())
myPlant.setTaskFertilizinChecked(false);
else
myPlant.setTaskFertilizinChecked(true);
}
else
{
if(myPlant.isTaskWateringChecked())
myPlant.setTaskWateringChecked(false);
else
myPlant.setTaskWateringChecked(true);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.v("Error retrieving plant", "loadPost:onCancelled", databaseError.toException());
}
});
Utils.addPlant(myPlant);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list);
}
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onEnabled(Context context) {
// Enter relevant functionality for when the first widget is created
}
@Override
public void onDisabled(Context context) {
// Enter relevant functionality for when the last widget is disabled
}
private static void setRemoteAdapter(Context context, @NonNull final RemoteViews views) {
views.setRemoteAdapter(R.id.widget_list,
new Intent(context, WidgetService.class));
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
plantID=intent.getStringExtra("plantID");
task=intent.getStringExtra("task");
}
}
package ie.dbs.myplants;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.CompoundButton;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static android.R.id.text1;
import static android.R.layout.simple_list_item_1;
public class DataProvider implements RemoteViewsService.RemoteViewsFactory {
List<String> plantNames = new ArrayList<>();
List<String> plantTasks=new ArrayList<>();
List<Boolean> plantTasksDone=new ArrayList<>();
Context mContext = null;
public DataProvider(Context context, Intent intent) {
mContext = context;
}
@Override
public void onCreate() {
initData();
}
@Override
public void onDataSetChanged() {
initData();
}
@Override
public void onDestroy() {
}
@Override
public int getCount() {
return plantNames.size();
}
@Override
public RemoteViews getViewAt(int position) {
RemoteViews view = new RemoteViews(mContext.getPackageName(),
R.layout.widget_list_view_row);
view.setTextViewText(R.id.widget_plant_name, plantNames.get(position));
view.setTextViewText(R.id.widget_plant_task, plantTasks.get(position));
if(plantTasksDone.get(position))
{
view.setTextViewText(R.id.widget_plant_task_done, "Done");
view.setInt(R.id.widget_list_row_linear, "setBackgroundResource", R.color.colorPrimary);
}
else
{
view.setTextViewText(R.id.widget_plant_task_done, "TODO");
view.setInt(R.id.widget_list_row_linear, "setBackgroundResource", R.color.colorWhite);
}
Bundle extras = new Bundle();
extras.putString("plantID", Utils.today_plants_task_string.get(position).getPlantID());
extras.putString("task", plantTasks.get(position));
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
view.setOnClickFillInIntent(R.id.widget_list_row_linear,fillInIntent);
return view;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
private void initData() {
plantNames.clear();
plantTasks.clear();
plantTasksDone.clear();
if(Utils.today_plants_task_string.size()!=0) {
for (int i = 0; i < Utils.today_plants_task_string.size(); i++) {
Plant myPlant=Utils.today_plants_task_string.get(i);
plantNames.add(myPlant.getName());
final Date tomorrow = Utils.addOneSecondToDate(Utils.getLastMinuteOfDay(new Date()));
Log.v("tomorrow", String.valueOf(tomorrow));
final Date fertilizing_date = myPlant.getNextFertilizing();
final Date watering_date = myPlant.getNextWatering();
if (fertilizing_date != null && fertilizing_date.before(tomorrow)) {
plantTasks.add("fertilizing");
if (myPlant.isTaskFertilizinChecked())
plantTasksDone.add(true);
else
plantTasksDone.add(false);
}
if (watering_date != null && watering_date.before(tomorrow)) {
plantTasks.add("watering");
if (myPlant.isTaskWateringChecked())
plantTasksDone.add(true);
else
plantTasksDone.add(false);
}
}
}
}
}