2020-01-09 10:44:32 +01:00
|
|
|
/* Copyright (C) 2018-2020 abettenburg, AndrewBedscastle, Carsten Pfeiffer,
|
2019-04-21 18:50:56 +02:00
|
|
|
Daniele Gobbetti
|
2019-02-13 20:43:30 +01:00
|
|
|
|
|
|
|
This file is part of Gadgetbridge.
|
|
|
|
|
|
|
|
Gadgetbridge is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Affero General Public License as published
|
|
|
|
by the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Gadgetbridge is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
2018-12-03 09:45:43 +01:00
|
|
|
package nodomain.freeyourgadget.gadgetbridge.activities;
|
|
|
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.view.View;
|
2019-01-26 15:52:40 +01:00
|
|
|
import android.widget.AdapterView;
|
|
|
|
import android.widget.Button;
|
|
|
|
import android.widget.EditText;
|
|
|
|
import android.widget.Spinner;
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2018-12-03 09:45:43 +01:00
|
|
|
import de.greenrobot.dao.query.Query;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.BuildConfig;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.adapter.AppBlacklistAdapter;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.entities.NotificationFilter;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.entities.NotificationFilterDao;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.entities.NotificationFilterEntry;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.entities.NotificationFilterEntryDao;
|
2019-01-12 10:00:33 +01:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
2018-12-03 09:45:43 +01:00
|
|
|
|
|
|
|
public class NotificationFilterActivity extends AbstractGBActivity {
|
|
|
|
|
|
|
|
public static final int NOTIFICATION_FILTER_MODE_NONE = 0;
|
|
|
|
public static final int NOTIFICATION_FILTER_MODE_WHITELIST = 1;
|
|
|
|
public static final int NOTIFICATION_FILTER_MODE_BLACKLIST = 2;
|
|
|
|
public static final int NOTIFICATION_FILTER_SUBMODE_ANY = 0;
|
|
|
|
public static final int NOTIFICATION_FILTER_SUBMODE_ALL = 1;
|
|
|
|
|
|
|
|
private Button mButtonSave;
|
|
|
|
private Spinner mSpinnerFilterMode;
|
|
|
|
private Spinner mSpinnerFilterSubMode;
|
|
|
|
private NotificationFilter mNotificationFilter;
|
|
|
|
private EditText mEditTextWords;
|
|
|
|
private List<String> mWordsList = new ArrayList<>();
|
|
|
|
private List<Long> mFilterEntryIds = new ArrayList<>();
|
|
|
|
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(NotificationFilterActivity.class);
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
setContentView(R.layout.activity_notification_filter);
|
|
|
|
|
|
|
|
String packageName = getIntent().getStringExtra(AppBlacklistAdapter.STRING_EXTRA_PACKAGE_NAME);
|
|
|
|
|
|
|
|
if (StringUtils.isBlank(packageName)) {
|
|
|
|
this.finish();
|
|
|
|
}
|
|
|
|
|
2018-12-06 15:11:50 +01:00
|
|
|
packageName = packageName.toLowerCase();
|
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
try (DBHandler db = GBApplication.acquireDB()) {
|
|
|
|
|
|
|
|
NotificationFilterDao notificationFilterDao = db.getDaoSession().getNotificationFilterDao();
|
|
|
|
NotificationFilterEntryDao notificationFilterEntryDao = db.getDaoSession().getNotificationFilterEntryDao();
|
|
|
|
|
|
|
|
Query<NotificationFilter> query = notificationFilterDao.queryBuilder().where(NotificationFilterDao.Properties.AppIdentifier.eq(packageName)).build();
|
|
|
|
mNotificationFilter = query.unique();
|
2018-12-03 09:45:43 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
if (mNotificationFilter == null) {
|
|
|
|
mNotificationFilter = new NotificationFilter();
|
|
|
|
mNotificationFilter.setAppIdentifier(packageName);
|
|
|
|
LOG.debug("New Notification Filter");
|
|
|
|
} else {
|
|
|
|
LOG.debug("Loaded existing notification filter");
|
|
|
|
Query<NotificationFilterEntry> queryEntries = notificationFilterEntryDao.queryBuilder().where(NotificationFilterEntryDao.Properties.NotificationFilterId.eq(mNotificationFilter.getId())).build();
|
|
|
|
List<NotificationFilterEntry> filterEntries = queryEntries.list();
|
2018-12-03 09:45:43 +01:00
|
|
|
for (NotificationFilterEntry temp : filterEntries) {
|
|
|
|
mWordsList.add(temp.getNotificationFilterContent());
|
|
|
|
mFilterEntryIds.add(temp.getId());
|
|
|
|
LOG.debug("Loaded filter word: " + temp.getNotificationFilterContent());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
setupView(db);
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
GB.toast(this, "Error accessing the database: " + e.getLocalizedMessage(), Toast.LENGTH_LONG, GB.ERROR);
|
|
|
|
this.finish();
|
|
|
|
}
|
2018-12-03 09:45:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onDestroy() {
|
|
|
|
super.onDestroy();
|
|
|
|
}
|
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
private void setupView(DBHandler db) {
|
2018-12-03 09:45:43 +01:00
|
|
|
|
|
|
|
mSpinnerFilterMode = findViewById(R.id.spinnerFilterMode);
|
|
|
|
mSpinnerFilterMode.setSelection(mNotificationFilter.getNotificationFilterMode());
|
|
|
|
|
|
|
|
mSpinnerFilterSubMode = findViewById(R.id.spinnerSubMode);
|
|
|
|
mSpinnerFilterMode.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
|
|
|
@Override
|
|
|
|
public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) {
|
|
|
|
switch (pos) {
|
|
|
|
case NOTIFICATION_FILTER_MODE_NONE:
|
|
|
|
mEditTextWords.setEnabled(false);
|
|
|
|
mSpinnerFilterSubMode.setEnabled(false);
|
|
|
|
break;
|
|
|
|
case NOTIFICATION_FILTER_MODE_BLACKLIST:
|
|
|
|
case NOTIFICATION_FILTER_MODE_WHITELIST:
|
|
|
|
mEditTextWords.setEnabled(true);
|
|
|
|
mSpinnerFilterSubMode.setEnabled(true);
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onNothingSelected(AdapterView<?> adapterView) {
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
mSpinnerFilterSubMode.setSelection(mNotificationFilter.getNotificationFilterSubMode());
|
|
|
|
|
|
|
|
mEditTextWords = findViewById(R.id.editTextWords);
|
|
|
|
|
|
|
|
if (!mWordsList.isEmpty()) {
|
|
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
for (String temp : mWordsList) {
|
|
|
|
builder.append(temp);
|
|
|
|
builder.append("\n");
|
|
|
|
}
|
|
|
|
mEditTextWords.setText(builder.toString());
|
|
|
|
}
|
|
|
|
|
|
|
|
mEditTextWords.setEnabled(mSpinnerFilterMode.getSelectedItemPosition() == NOTIFICATION_FILTER_MODE_NONE);
|
|
|
|
|
|
|
|
mButtonSave = findViewById(R.id.buttonSaveFilter);
|
2019-01-12 10:00:33 +01:00
|
|
|
|
2018-12-03 09:45:43 +01:00
|
|
|
mButtonSave.setOnClickListener(new View.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(View view) {
|
2019-01-12 10:00:33 +01:00
|
|
|
saveFilter();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2018-12-03 09:45:43 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
private void saveFilter() {
|
|
|
|
// TODO: check for modifications, only save if something changed
|
|
|
|
String words = mEditTextWords.getText().toString();
|
2018-12-03 09:45:43 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
if (StringUtils.isBlank(words) && mSpinnerFilterMode.getSelectedItemPosition() != NOTIFICATION_FILTER_MODE_NONE) {
|
|
|
|
Toast.makeText(NotificationFilterActivity.this, R.string.toast_notification_filter_words_empty_hint, Toast.LENGTH_SHORT).show();
|
|
|
|
return;
|
|
|
|
}
|
2018-12-03 09:45:43 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
try (DBHandler db = GBApplication.acquireDB()) {
|
|
|
|
NotificationFilterDao notificationFilterDao = db.getDaoSession().getNotificationFilterDao();
|
|
|
|
NotificationFilterEntryDao notificationFilterEntryDao = db.getDaoSession().getNotificationFilterEntryDao();
|
2018-12-03 09:45:43 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
debugOutput(notificationFilterDao);
|
2018-12-03 09:45:43 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
mNotificationFilter.setNotificationFilterMode(mSpinnerFilterMode.getSelectedItemPosition());
|
|
|
|
mNotificationFilter.setNotificationFilterSubMode(mSpinnerFilterSubMode.getSelectedItemPosition());
|
2018-12-03 09:45:43 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
notificationFilterEntryDao.deleteByKeyInTx(mFilterEntryIds);
|
2018-12-03 09:45:43 +01:00
|
|
|
|
2019-02-28 21:57:45 +01:00
|
|
|
long filterId = notificationFilterDao.insertOrReplace(mNotificationFilter);
|
2018-12-06 15:11:50 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
// only save words if filter mode != none
|
|
|
|
if (mNotificationFilter.getNotificationFilterMode() != NOTIFICATION_FILTER_MODE_NONE) {
|
|
|
|
String[] wordsSplitted = words.split("\n");
|
|
|
|
for (String temp : wordsSplitted) {
|
2018-12-06 15:11:50 +01:00
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
if (StringUtils.isBlank(temp)) {
|
|
|
|
continue;
|
2018-12-03 09:45:43 +01:00
|
|
|
}
|
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
temp = temp.trim();
|
|
|
|
NotificationFilterEntry notificationFilterEntry = new NotificationFilterEntry();
|
|
|
|
notificationFilterEntry.setNotificationFilterContent(temp);
|
|
|
|
notificationFilterEntry.setNotificationFilterId(filterId);
|
|
|
|
notificationFilterEntryDao.insert(notificationFilterEntry);
|
2018-12-03 09:45:43 +01:00
|
|
|
}
|
|
|
|
}
|
2019-01-12 10:00:33 +01:00
|
|
|
|
|
|
|
Toast.makeText(NotificationFilterActivity.this, R.string.toast_notification_filter_saved_successfully, Toast.LENGTH_SHORT).show();
|
|
|
|
NotificationFilterActivity.this.finish();
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
GB.toast(NotificationFilterActivity.this, "Error accessing the database: " + e.getLocalizedMessage(), Toast.LENGTH_LONG, GB.ERROR);
|
|
|
|
}
|
2018-12-03 09:45:43 +01:00
|
|
|
}
|
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
/**
|
|
|
|
* Only used for debugging purposes
|
|
|
|
*
|
|
|
|
* @param notificationFilterDao {@link NotificationFilterDao}
|
|
|
|
*/
|
2018-12-03 09:45:43 +01:00
|
|
|
private void debugOutput(NotificationFilterDao notificationFilterDao) {
|
|
|
|
if (BuildConfig.DEBUG) {
|
|
|
|
|
|
|
|
List<NotificationFilter> filters = notificationFilterDao.loadAll();
|
|
|
|
|
2019-01-12 10:00:33 +01:00
|
|
|
LOG.info("Saved filters");
|
2018-12-03 09:45:43 +01:00
|
|
|
|
|
|
|
for (NotificationFilter temp : filters) {
|
2019-01-12 10:00:33 +01:00
|
|
|
LOG.info("Filter: " + temp.getId() + " " + temp.getAppIdentifier());
|
2018-12-03 09:45:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|