Как получить доступ к базе данных из liveata в классе broadCastReceiver? - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу получить доступ к базе данных из liveata в классе broadcastReceiver, но не могу получить к ней доступ, я сделал это ..

AndroidMenifest. xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.birthdaynotifier">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".AddEditActivity"
            android:parentActivityName=".MainActivity"></activity>
        <activity android:name=".MainActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".notification.AlertReceiver"
            android:directBootAware="true"
            android:enabled="false"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

в основной деятельности есть некоторый фрагмент, в котором вещательный приемник называется

HomeFragment. java

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootview = inflater.inflate(R.layout.fragment_home, container, false);
        RecyclerView recyclerView = rootview.findViewById(R.id.recyclerView_home_container);
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        recyclerView.setHasFixedSize(true);

        final BirthDateAdapter adapter = new BirthDateAdapter();
        recyclerView.setAdapter(adapter);

        birthDateViewModel = ViewModelProviders.of(this).get(BirthDateViewModel.class);
        birthDateViewModel.getAllBirthDate().observe(getViewLifecycleOwner(), new Observer<List<BirthDate>>() {
            @Override
            public void onChanged(@Nullable List<BirthDate> birthDates) {
                //update RecyclerView
                String sortListName = sharedpreferences.getString(sortTitle,null);
                sortList.setSelection(spinnerAdapter.getPosition(sortListName));
                if(sortListName.equals("Date")){
                    Collections.sort(birthDates, new Comparator<BirthDate>() {
                        @Override
                        public int compare(BirthDate t1, BirthDate t2) {
                            if(t1.getMonth()<t2.getMonth()){
                                return -1;
                            }else if(t1.getMonth()>t2.getMonth()){
                                return 1;
                            }else{
                                if(t1.getDay()<t2.getDay()){
                                    return -1;
                                }else{
                                    return 1;
                                }
                            }
                        }
                    });
                }else{
                    Collections.sort(birthDates, new Comparator<BirthDate>() {
                        @Override
                        public int compare(BirthDate birthDate, BirthDate t1) {
                            return birthDate.getName().compareToIgnoreCase(t1.getName());
                        }
                    });
                }
                adapter.submitList(birthDates);

            }
        });
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, int direction) {
                new AlertDialog.Builder(getContext())
                        .setTitle("Delete entry")
                        .setMessage("Are you sure you want to delete this entry?")
                        .setCancelable(false)
                        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                birthDateViewModel.delete(adapter.getBirthDateAt(viewHolder.getAdapterPosition()));
                                Toast.makeText(getContext(), "BirthDate deleted", Toast.LENGTH_SHORT).show();

                                BirthDate birthDate =adapter.getBirthDateAt(viewHolder.getAdapterPosition());
                                int id = birthDate.getId();
                                String name = birthDate.getName();


                                AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
                                Intent intent = new Intent(getContext(), AlertReceiver.class);
                                intent.putExtra("message",name);
                                intent.putExtra("Id",id);
                                PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), id, intent, 0);

                                alarmManager.cancel(pendingIntent);

                                ComponentName receiver = new ComponentName(getContext(), AlertReceiver.class);
                                PackageManager pm = getContext().getPackageManager();

                                pm.setComponentEnabledSetting(receiver,
                                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                                        PackageManager.DONT_KILL_APP);

                            }
                        })
                        .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                adapter.notifyDataSetChanged();
                            }
                        })
                        .setIcon(R.drawable.ic_warning_black_24dp)
                        .show();
            }
        }).attachToRecyclerView(recyclerView);
        adapter.setOnItemClickListener(new BirthDateAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BirthDate birthDate) {
                Intent intent = new Intent(getActivity(), AddEditActivity.class);

                intent.putExtra(AddEditActivity.EXTRA_ID, birthDate.getId());
                intent.putExtra(AddEditActivity.EXTRA_NAME, birthDate.getName());
                intent.putExtra(AddEditActivity.EXTRA_TIME, birthDate.getTime());
                intent.putExtra(AddEditActivity.EXTRA_DAY, birthDate.getDay());
                intent.putExtra(AddEditActivity.EXTRA_MONTH, birthDate.getMonth());
                intent.putExtra(AddEditActivity.EXTRA_NOTIFICATION, birthDate.getNotification());
                startActivityForResult(intent, EDIT_NEW_REQUEST);
            }
        });


        return rootview;
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == ADD_NEW_REQUEST && resultCode == RESULT_OK) {
            int id = data.getIntExtra(AddEditActivity.EXTRA_ID, -1);
            String name = data.getStringExtra(AddEditActivity.EXTRA_NAME);
            String time = data.getStringExtra(AddEditActivity.EXTRA_TIME);
            int day = data.getIntExtra(AddEditActivity.EXTRA_DAY, 1);
            int month = data.getIntExtra(AddEditActivity.EXTRA_MONTH, 1);
            boolean notificatiion = data.getBooleanExtra(AddEditActivity.EXTRA_NOTIFICATION,true);

            BirthDate birthDate = new BirthDate(name, time, day, month, notificatiion);
            birthDateViewModel.insert(birthDate);


            if(notificatiion){
                SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
                Date date = null;
                try {
                    date = sdf.parse(time);
                } catch (ParseException e) { }
                Calendar calendar = Calendar.getInstance();
                Calendar currentTime = Calendar.getInstance();

                int year;
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                    LocalDate currentDate = LocalDate.now();
                    year = currentDate.getYear();
                }else{
                    Date today = new Date();
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(today);
                    year = cal.get(Calendar.YEAR);
                }


                calendar.setTime(date);
                calendar.set(Calendar.YEAR,year);
                calendar.set(Calendar.MONTH,month-1);
                calendar.set(Calendar.DAY_OF_MONTH,day);
                calendar.set(Calendar.SECOND, 0);

                /*Toast.makeText(getContext(),calendar.get(Calendar.HOUR)+" : "+calendar.get(Calendar.MINUTE)+
                        " ( "+calendar.get(Calendar.YEAR)+" - "+calendar.get(Calendar.MONTH)+" - "+calendar.get(Calendar.DAY_OF_MONTH)+
                        " Date : "+calendar.get(Calendar.DATE)+" )",Toast.LENGTH_LONG ).show();*/

                if (calendar.before(Calendar.getInstance())) {
                    calendar.add(Calendar.YEAR, 1);
                }


                AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
                Intent intent = new Intent(getContext(), AlertReceiver.class);
                intent.putExtra("message",name);
                intent.putExtra("Id",id);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), id, intent, 0);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                } else {
                    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                }
                ComponentName receiver = new ComponentName(getContext(), AlertReceiver.class);
                PackageManager pm = getContext().getPackageManager();



             pm.setComponentEnabledSetting(receiver,
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                            PackageManager.DONT_KILL_APP);
             }
        }
    }

AlertReceiver. java

public class AlertReceiver extends BroadcastReceiver implements ViewModelStoreOwner {
    BirthDateViewModel birthDateViewModel;

    @Override
    public void onReceive(Context context, Intent intent) {
        birthDateViewModel = ViewModelProviders.of(this).get(BirthDateViewModel.class);

        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
           List<BirthDate> birthDates = birthDateViewModel.getAllBirthDate().getValue();
       //some code
     }else{
            String message = "Your friend ! please wish ..";
            int id = intent.getIntExtra("Id",1);
            NotificationHelper notificationHelper = new NotificationHelper(context);
            NotificationCompat.Builder nb = notificationHelper.getChannelNotification(message);
            notificationHelper.getManager().notify(id, nb.build());

            List<BirthDate> birthDates =  birthDateViewModel.getAllBirthDate().getValue();
     }

BirthDateDao. java

@Dao
public interface BirthDateDao {

    @Insert
    void insert(BirthDate birthDate);

    @Update
    void update(BirthDate birthDate);

    @Delete
    void delete(BirthDate birthDate);

    @Query("DELETE FROM birthdate_table")
    void deleteAllBirthDate();

    @Query("SELECT * FROM birthdate_table ORDER BY name ")
    LiveData<List<BirthDate>> getAllBirthdate();
}

BirthdateViewModel. java

public class BirthDateViewModel extends AndroidViewModel {

    private BirthDateRepository repository;
    private LiveData<List<BirthDate>> allBirthDate;

    public BirthDateViewModel(@NonNull Application application) {
        super(application);

        repository = new BirthDateRepository(application);
        allBirthDate = repository.getAllBirthDate();
    }

    public void insert(BirthDate birthDate) {
        repository.insert(birthDate);
    }

    public void update(BirthDate birthDate) {
        repository.update(birthDate);
    }

    public void delete(BirthDate birthDate) {
        repository.delete(birthDate);
    }

    public void deleteAllBirthDate() {
        repository.deleteAllBirthDate();
    }

    public LiveData<List<BirthDate>> getAllBirthDate() {
        return allBirthDate;
    }
}

BirthDateRepository. java

public class BirthDateRepository {

    private BirthDateDao birthDateDao;
    private LiveData<List<BirthDate>> allBirthDate;

    public BirthDateRepository(Application application) {
        BirthDateDatabase database = BirthDateDatabase.getInstance(application);
        birthDateDao = database.birthDateDao();
        allBirthDate = birthDateDao.getAllBirthdate();
    }

    public void insert(BirthDate birthDate) {
        new InsertBirthDateAsyncTask(birthDateDao).execute(birthDate);
    }

    public void update(BirthDate birthDate) {
        new UpdateBirthDateAsyncTask(birthDateDao).execute(birthDate);
    }

    public void delete(BirthDate birthDate) {
        new DeleteBirthDateAsyncTask(birthDateDao).execute(birthDate);
    }

    public void deleteAllBirthDate() {
        new DeleteAllBirthDatesAsyncTask(birthDateDao).execute();
    }

    public LiveData<List<BirthDate>> getAllBirthDate() {
        return allBirthDate;
    }

    private static class InsertBirthDateAsyncTask extends AsyncTask<BirthDate, Void, Void> {
        private BirthDateDao birthDateDao;

        private InsertBirthDateAsyncTask(BirthDateDao birthDateDao) {
            this.birthDateDao = birthDateDao;
        }

        @Override
        protected Void doInBackground(BirthDate... birthDates) {
            birthDateDao.insert(birthDates[0]);
            return null;
        }
    }

    private static class UpdateBirthDateAsyncTask extends AsyncTask<BirthDate, Void, Void> {
        private BirthDateDao birthDateDao;

        private UpdateBirthDateAsyncTask(BirthDateDao birthDateDao) {
            this.birthDateDao = birthDateDao;
        }

        @Override
        protected Void doInBackground(BirthDate... birthDates) {
            birthDateDao.update(birthDates[0]);
            return null;
        }
    }

    private static class DeleteBirthDateAsyncTask extends AsyncTask<BirthDate, Void, Void> {
        private BirthDateDao birthDateDao;

        private DeleteBirthDateAsyncTask(BirthDateDao birthDateDao) {
            this.birthDateDao = birthDateDao;
        }

        @Override
        protected Void doInBackground(BirthDate... birthDates) {
            birthDateDao.delete(birthDates[0]);
            return null;
        }
    }

    private static class DeleteAllBirthDatesAsyncTask extends AsyncTask<Void, Void, Void> {
        private BirthDateDao birthDateDao;

        private DeleteAllBirthDatesAsyncTask(BirthDateDao birthDateDao) {
            this.birthDateDao = birthDateDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            birthDateDao.deleteAllBirthDate();
            return null;
        }
    }
}

BirthdateDatabase. java

public abstract class BirthDateDatabase extends RoomDatabase {

    private static BirthDateDatabase instance;

    public abstract BirthDateDao birthDateDao();

    public static synchronized BirthDateDatabase getInstance(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context.getApplicationContext(),
                    BirthDateDatabase.class, "birthdate_database")
                    .fallbackToDestructiveMigration()
                    .addCallback(roomCallback)
                    .build();
        }
        return instance;
    }

    private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback() {
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);
            new PopulateDbAsyncTask(instance).execute();
        }
    };

    private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void> {
        private BirthDateDao birthDateDao;

        private PopulateDbAsyncTask(BirthDateDatabase db) {
            birthDateDao = db.birthDateDao();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            return null;
        }
    }
}

Теперь, как я могу получить доступ к базе данных liveata в AlertReceiver. java и сохраните данные в списке с именами дат рождения. как я могу это сделать ??

...