/** * Copyright (c) 2013, Redsolution LTD. All rights reserved. * * This file is part of Xabber project; you can redistribute it and/or * modify it under the terms of the GNU General Public License, Version 3. * * Xabber 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 General Public License for more details. * * You should have received a copy of the GNU General Public License, * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.xabber.android.data.message.phrase; import android.database.Cursor; import android.net.Uri; import com.xabber.android.data.Application; import com.xabber.android.data.OnLoadListener; import com.xabber.android.data.database.sqlite.PhraseTable; import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.message.chat.ChatManager; import com.xabber.android.data.roster.RosterManager; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Manage custom notification based on message. * * @author alexander.ivanov */ public class PhraseManager implements OnLoadListener { /** * List of settings. */ private final List<Phrase> phrases; private static PhraseManager instance; public static PhraseManager getInstance() { if (instance == null) { instance = new PhraseManager(); } return instance; } private PhraseManager() { phrases = new ArrayList<>(); } @Override public void onLoad() { final Collection<Phrase> phrases = new ArrayList<>(); Cursor cursor; cursor = PhraseTable.getInstance().list(); try { if (cursor.moveToFirst()) { do { phrases.add(new Phrase(PhraseTable.getId(cursor), PhraseTable.getValue(cursor), PhraseTable .getUser(cursor), PhraseTable .getGroup(cursor), PhraseTable .isRegexp(cursor), PhraseTable .getSound(cursor))); } while (cursor.moveToNext()); } } finally { cursor.close(); } Application.getInstance().runOnUiThread(new Runnable() { @Override public void run() { onLoaded(phrases); } }); } private void onLoaded(Collection<Phrase> phrases) { this.phrases.addAll(phrases); } /** * @param text * @return Sound associated with first matched phrase. Chat specific setting * if no one matches . */ public Uri getSound(AccountJid account, UserJid user, String text) { Collection<String> groups = RosterManager.getInstance().getGroups( account, user); for (Phrase phrase : phrases) if (phrase.matches(text, user.toString(), groups)) { Uri value = phrase.getSound(); if (ChatManager.EMPTY_SOUND.equals(value)) return null; return value; } return ChatManager.getInstance().getSound(account, user); } /** * Update phrase or create. * * @param phrase can be <code>null</code> for new phrase. * @param value * @param regexp * @param sound */ public void updateOrCreatePhrase(Phrase phrase, String value, String user, String group, boolean regexp, Uri sound) { if (phrase == null) { phrase = new Phrase(null, value, user, group, regexp, sound); phrases.add(phrase); } else { phrase.update(value, user, group, regexp, sound); } writePhrase(phrase, value, user, group, regexp, sound); } /** * Removes phrase. * * @param index */ public void removePhrase(int index) { phrases.remove(getPhrase(index)); } private void writePhrase(final Phrase phrase, final String value, final String user, final String group, final boolean regexp, final Uri sound) { Application.getInstance().runInBackgroundUserRequest(new Runnable() { @Override public void run() { phrase.setId(PhraseTable.getInstance().write(phrase.getId(), value, user, group, regexp, sound == null ? ChatManager.EMPTY_SOUND : sound)); } }); } public Collection<Integer> getPhrases() { Collection<Integer> collection = new ArrayList<Integer>(); for (int index = 0; index < phrases.size(); index++) collection.add(index); return collection; } public Phrase getPhrase(int index) { if (index < 0 || index >= phrases.size()) return null; return phrases.get(index); } }