@@ 331,19 331,21 @@ public class NotificationService {
"notifications_from_strangers", R.bool.notifications_from_strangers);
}
- private boolean isQuietHours() {
+ private boolean isQuietHours(Account account) {
+ if (mXmppConnectionService.getAccounts().size() < 2) account = null;
+ final String suffix = account == null ? "" : ":" + account.getUuid();
if (!mXmppConnectionService.getBooleanPreference(
- "enable_quiet_hours", R.bool.enable_quiet_hours)) {
+ "enable_quiet_hours" + suffix, R.bool.enable_quiet_hours)) {
return false;
}
final SharedPreferences preferences =
PreferenceManager.getDefaultSharedPreferences(mXmppConnectionService);
final long startTime =
TimePreference.minutesToTimestamp(
- preferences.getLong("quiet_hours_start", TimePreference.DEFAULT_VALUE));
+ preferences.getLong("quiet_hours_start" + suffix, TimePreference.DEFAULT_VALUE));
final long endTime =
TimePreference.minutesToTimestamp(
- preferences.getLong("quiet_hours_end", TimePreference.DEFAULT_VALUE));
+ preferences.getLong("quiet_hours_end" + suffix, TimePreference.DEFAULT_VALUE));
final long nowTime = Calendar.getInstance().getTimeInMillis();
if (endTime < startTime) {
@@ 562,7 564,7 @@ public class NotificationService {
}
public synchronized void startRinging(final AbstractJingleConnection.Id id, final Set<Media> media) {
- if (isQuietHours()) return;
+ if (isQuietHours(id.getContact().getAccount())) return;
if (tryRingingWithDialerUI(id, media)) {
return;
@@ 912,8 914,6 @@ public class NotificationService {
final SharedPreferences preferences =
PreferenceManager.getDefaultSharedPreferences(mXmppConnectionService);
- final boolean quiteHours = isQuietHours();
-
final boolean notifyOnlyOneChild =
notify
&& conversations != null
@@ 930,27 930,29 @@ public class NotificationService {
final Builder mBuilder;
if (notifications.size() == 1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
ArrayList<Message> messages = notifications.values().iterator().next();
- mBuilder = buildSingleConversations(messages, notify, quiteHours);
- modifyForSoundVibrationAndLight(mBuilder, notify, quiteHours, preferences, messages.isEmpty() ? null : messages.get(0).getConversation().getAccount());
+ final Account account = messages.isEmpty() ? null : messages.get(0).getConversation().getAccount();
+ mBuilder = buildSingleConversations(messages, notify, isQuietHours(account));
+ modifyForSoundVibrationAndLight(mBuilder, notify, preferences, account);
notify(NOTIFICATION_ID, mBuilder.build());
} else {
- mBuilder = buildMultipleConversation(notify, quiteHours);
+ mBuilder = buildMultipleConversation(notify, isQuietHours(null));
if (notifyOnlyOneChild) {
mBuilder.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN);
}
- modifyForSoundVibrationAndLight(mBuilder, notify, quiteHours, preferences, null);
+ modifyForSoundVibrationAndLight(mBuilder, notify, preferences, null);
if (!summaryOnly) {
for (Map.Entry<String, ArrayList<Message>> entry : notifications.entrySet()) {
String uuid = entry.getKey();
final boolean notifyThis =
notifyOnlyOneChild ? conversations.contains(uuid) : notify;
+ final Account account = entry.getValue().isEmpty() ? null : entry.getValue().get(0).getConversation().getAccount();
Builder singleBuilder =
- buildSingleConversations(entry.getValue(), notifyThis, quiteHours);
+ buildSingleConversations(entry.getValue(), notifyThis, isQuietHours(account));
if (!notifyOnlyOneChild) {
singleBuilder.setGroupAlertBehavior(
NotificationCompat.GROUP_ALERT_SUMMARY);
}
- modifyForSoundVibrationAndLight(singleBuilder, notifyThis, quiteHours, preferences, entry.getValue().isEmpty() ? null : entry.getValue().get(0).getConversation().getAccount());
+ modifyForSoundVibrationAndLight(singleBuilder, notifyThis, preferences, account);
singleBuilder.setGroup(MESSAGES_GROUP);
notify(entry.getKey(), NOTIFICATION_ID, singleBuilder.build());
}
@@ 986,7 988,7 @@ public class NotificationService {
}
private void modifyForSoundVibrationAndLight(
- Builder mBuilder, boolean notify, boolean quietHours, SharedPreferences preferences, Account account) {
+ Builder mBuilder, boolean notify, SharedPreferences preferences, Account account) {
final Resources resources = mXmppConnectionService.getResources();
final String ringtone =
preferences.getString(
@@ 1000,7 1002,7 @@ public class NotificationService {
final boolean headsup =
preferences.getBoolean(
"notification_headsup", resources.getBoolean(R.bool.headsup_notifications));
- if (notify && !quietHours) {
+ if (notify && !isQuietHours(account)) {
if (vibrate) {
final int dat = 70;
final long[] pattern = {0, 3 * dat, dat, dat};
@@ 1113,7 1115,7 @@ public class NotificationService {
private Builder buildMissedCall(
final Conversational conversation, final MissedCallsInfo info, boolean publicVersion) {
final Builder builder =
- new NotificationCompat.Builder(mXmppConnectionService, isQuietHours() ? "quiet_hours" : "missed_calls");
+ new NotificationCompat.Builder(mXmppConnectionService, isQuietHours(conversation.getAccount()) ? "quiet_hours" : "missed_calls");
final String title =
(info.getNumberOfCalls() == 1)
? mXmppConnectionService.getString(R.string.missed_call)
@@ 1167,7 1169,7 @@ public class NotificationService {
if (led) {
builder.setLights(LED_COLOR, 2000, 3000);
}
- builder.setPriority(isQuietHours() ? NotificationCompat.PRIORITY_LOW : NotificationCompat.PRIORITY_HIGH);
+ builder.setPriority(isQuietHours(account) ? NotificationCompat.PRIORITY_LOW : NotificationCompat.PRIORITY_HIGH);
builder.setSound(null);
setNotificationColor(builder, account);
}
@@ 646,6 646,12 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
binding.accountColorBox.setOnClickListener((v) -> {
showColorDialog();
});
+ binding.quietHoursBox.setOnClickListener((v) -> {
+ Intent intent = new Intent(Intent.ACTION_VIEW, null, EditAccountActivity.this, SettingsActivity.class);
+ intent.putExtra("page", "quiet_hours");
+ intent.putExtra("suffix", ":" + mAccount.getUuid());
+ startActivity(intent);
+ });
}
private void onEditYourNameClicked(View view) {
@@ 1072,8 1078,10 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
if (xmppConnectionService != null && xmppConnectionService.getAccounts().size() > 1) {
binding.accountColorBox.setVisibility(View.VISIBLE);
binding.colorPreview.setBackgroundColor(mAccount.getColor(isDarkTheme()));
+ binding.quietHoursBox.setVisibility(View.VISIBLE);
} else {
binding.accountColorBox.setVisibility(View.GONE);
+ binding.quietHoursBox.setVisibility(View.GONE);
}
final boolean togglePassword = mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || !mAccount.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY);
@@ 9,6 9,8 @@ import android.preference.PreferenceScreen;
import android.text.TextUtils;
import android.widget.ListView;
+import java.lang.reflect.Method;
+
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.utils.Compatibility;
@@ 16,6 18,7 @@ import eu.siacs.conversations.utils.Compatibility;
public class SettingsFragment extends PreferenceFragment {
private String page = null;
+ private String suffix = null;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ 57,6 60,7 @@ public class SettingsFragment extends PreferenceFragment {
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
if (intent.getExtras() != null) {
this.page = intent.getExtras().getString("page");
+ this.suffix = intent.getExtras().getString("suffix");
if (wasEmpty) {
openPreferenceScreen(page);
}
@@ 71,7 75,30 @@ public class SettingsFragment extends PreferenceFragment {
final PreferenceScreen preferenceScreen = (PreferenceScreen) pref;
getActivity().setTitle(preferenceScreen.getTitle());
preferenceScreen.setDependency("");
+ if (this.suffix != null) {
+ for (int i = 0; i < preferenceScreen.getPreferenceCount(); i++) {
+ final Preference p = preferenceScreen.getPreference(i);
+ if (!p.hasKey()) continue;
+ p.setKey(p.getKey() + this.suffix);
+ if (p.getDependency() != null && !"".equals(p.getDependency())) {
+ p.setDependency(p.getDependency() + this.suffix);
+ }
+ reloadPref(p);
+ }
+ }
setPreferenceScreen((PreferenceScreen) pref);
}
}
+
+ static void reloadPref(final Preference pref) {
+ Class iterClass = pref.getClass();
+ while(iterClass != Object.class) {
+ try {
+ Method m = iterClass.getDeclaredMethod("onSetInitialValue", boolean.class, Object.class);
+ m.setAccessible(true);
+ m.invoke(pref, true, null);
+ } catch (Exception e) { }
+ iterClass = iterClass.getSuperclass();
+ }
+ }
}