package adonai.diary_browser;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import adonai.diary_browser.pages.DiaryLinkList;
import adonai.diary_browser.pages.DiaryPage;
import adonai.diary_browser.pages.ListPage;
import adonai.diary_browser.pages.UmailListPage;
import adonai.diary_browser.pages.UmailPage;
import adonai.diary_browser.pages.WebPage;
/**
* Синглетон данных пользователя в текущем сеансе.
* Все записи и чтения отсюда, хоть и разнесены по разным потокам, но не выполняются одновременно.
*
* Обновляются эти данные в потоке NetworkService'a, запрашиваются - в UI-потоках различных активностей
*/
public class UserData {
private static UserData user = new UserData();
private boolean isAuthorized;
// Динамические списки постов
private DiaryLinkList<ListPage> currentDiaries = new DiaryLinkList<>();
private DiaryLinkList<UmailListPage> currentUmails = new DiaryLinkList<>();
private WebPage currentDiaryPage = new DiaryPage("");
private UmailPage currentUmailPage = new UmailPage("");
// Личные данные
private String ownProfileId = "";
private String userName = "";
private String signature = "";
// Ссылки
private String ownDiaryUrl = "";
private String ownFavoritesPageUrl = "http://www.diary.ru/?favorite";
// число новых постов в дискуссиях
private int newDiscussNum;
private String newDiscussLink = "";
// число новых U-Mail
private int newUmailNum;
private String newUmailLink = "";
// число новых постов в дневнике
private int newDiaryCommentsNum;
private String newDiaryLink = "";
public static UserData getInstance() {
return user;
}
public static void clear() {
user = new UserData();
}
private UserData()
{
}
// обновляем контент
public void updateData(Element tag) {
// цифровая подпись
Element sigNode = tag.getElementsByAttributeValue("name", "signature").first();
if (sigNode != null)
setSignature(sigNode.attr("value"));
// данные о ссылках на свои страницы
Elements nodes = tag.select("div#inf_contant, div#myDiaryLinks").select("a[href]");
boolean hasNewDiscussions = false, hasNewDiaryComments = false, hasNewUmails = false;
for (Element node : nodes) {
// ссылка на свой дневник
if (node.text().equals("Мой дневник"))
setOwnDiaryUrl(node.attr("href"));
// идентификатор своего профиля
if (node.attr("href").startsWith("/member/")) {
if (!node.text().equals("Мой профиль"))
setUserName(node.text());
String Id = node.attr("href");
setOwnProfileId(Id.substring(Id.lastIndexOf("?") + 1));
}
// дискасс
if (node.id().equals("menuNewDescussions")) {
hasNewDiscussions = true;
setNewDiscussNum(Integer.valueOf(node.text()));
setNewDiscussLink(node.attr("href"));
}
// дневник
// как минимум 3 родителя точно будет - div, body и html, значит, можно не проверять.
if (node.parent().parent().id().equals("new_comments_count") || node.parent().parent().parent().id().equals("myDiaryLink")) {
hasNewDiaryComments = true;
setNewDiaryCommentsNum(Integer.valueOf(node.text()));
setNewDiaryLink(node.attr("href"));
}
// U-мылки
if (node.attr("href").contains("/u-mail/folder/")) {
hasNewUmails = true;
setNewUmailNum(Integer.valueOf(node.text()));
setNewUmailLink(node.attr("href"));
}
}
if (!hasNewDiscussions)
setNewDiscussNum(0);
if (!hasNewDiaryComments)
setNewDiaryCommentsNum(0);
if (!hasNewUmails)
setNewUmailNum(0);
}
String getDiscussionsUrl() {
return Utils.DISCUSSIONS_PAGE;
}
String getFavoritesUrl() {
return Utils.FAVORITES_PAGE;
}
String getSubscribersUrl() {
return Utils.SUBSCRIBERS_PAGE;
}
boolean isAuthorized() {
return isAuthorized;
}
void setAuthorized(boolean isAuthorised) {
this.isAuthorized = isAuthorised;
}
DiaryLinkList<ListPage> getCurrentDiaries() {
return currentDiaries;
}
void setCurrentDiaries(DiaryLinkList<ListPage> currentDiaries) {
this.currentDiaries = currentDiaries;
}
DiaryLinkList<UmailListPage> getCurrentUmails() {
return currentUmails;
}
void setCurrentUmails(DiaryLinkList<UmailListPage> currentUmails) {
this.currentUmails = currentUmails;
}
WebPage getCurrentDiaryPage() {
return currentDiaryPage;
}
void setCurrentDiaryPage(WebPage currentDiaryPage) {
this.currentDiaryPage = currentDiaryPage;
}
UmailPage getCurrentUmailPage() {
return currentUmailPage;
}
void setCurrentUmailPage(UmailPage currentUmailPage) {
this.currentUmailPage = currentUmailPage;
}
String getOwnDiaryUrl() {
return ownDiaryUrl;
}
public String getOwnFavoritesPageUrl() {
return ownFavoritesPageUrl;
}
/**
* Также устанавливает ссылку на избранное
* @param ownDiaryUrl ссылка на дневник владельца
*/
void setOwnDiaryUrl(String ownDiaryUrl) {
this.ownDiaryUrl = ownDiaryUrl;
this.ownFavoritesPageUrl = ownDiaryUrl + "?favorite";
}
String getOwnProfileId() {
return ownProfileId;
}
void setOwnProfileId(String ownProfileId) {
this.ownProfileId = ownProfileId;
}
String getUserName() {
return userName;
}
void setUserName(String userName) {
this.userName = userName;
}
String getSignature() {
return signature;
}
void setSignature(String signature) {
this.signature = signature;
}
Integer getNewDiscussNum() {
return newDiscussNum;
}
void setNewDiscussNum(Integer newDiscussNum) {
this.newDiscussNum = newDiscussNum;
}
String getNewDiscussLink() {
return newDiscussLink;
}
void setNewDiscussLink(String newDiscussLink) {
this.newDiscussLink = newDiscussLink;
}
Integer getNewUmailNum() {
return newUmailNum;
}
void setNewUmailNum(Integer newUmailNum) {
this.newUmailNum = newUmailNum;
}
String getNewUmailLink() {
return newUmailLink;
}
void setNewUmailLink(String newUmailLink) {
this.newUmailLink = newUmailLink;
}
Integer getNewDiaryCommentsNum() {
return newDiaryCommentsNum;
}
void setNewDiaryCommentsNum(Integer newDiaryCommentsNum) {
this.newDiaryCommentsNum = newDiaryCommentsNum;
}
String getNewDiaryLink() {
return newDiaryLink;
}
void setNewDiaryLink(String newDiaryLink) {
this.newDiaryLink = newDiaryLink;
}
public String getMostRecentNotification() {
if (newDiscussNum > 0) {
return newDiscussLink;
} else if (newDiaryCommentsNum > 0) {
return newDiaryLink;
} /* else if (newUmailNum > 0)
return newUmailLink; */
return null;
}
public boolean hasNotifications() {
return getNewDiaryCommentsNum() + getNewDiscussNum() + getNewUmailNum() > 0;
}
}