Могу ли я изменить объект из виджета приложения коллекции вместо открытия действия? (Android студия Java) - PullRequest
1 голос
/ 05 ноября 2019

В настоящее время я создаю приложение, которое обрабатывает растения дома как мой школьный проект.

Приложение отображает раздел ежедневных задач (полив, удобрение), который я также отображаю в виджете коллекции.

Теперь, если пользователь щелкает строку в виджете, я хотел бы обновить свое растение и отметить его как полив или удобрение. Для этого мне нужно изменить один из атрибутов моего объекта, а затем отправить его в базу данных. Возможно ли это, или вы можете открыть действия только из виджета?

Вот мой код:

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);
                }

            }
        }
    }
}

...