/*
* Copyright (C) 2014 Pedro Vicente Gómez Sánchez.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.pedrovgs.tuentitv.presenter;
import com.github.pedrovgs.tuentitv.R;
import com.github.pedrovgs.tuentitv.model.Accounts;
import com.github.pedrovgs.tuentitv.model.Agenda;
import com.github.pedrovgs.tuentitv.model.Chat;
import com.github.pedrovgs.tuentitv.model.Contact;
import com.github.pedrovgs.tuentitv.model.ConversationSummary;
import com.github.pedrovgs.tuentitv.model.MediaElement;
import com.github.pedrovgs.tuentitv.model.MediaGallery;
import com.github.pedrovgs.tuentitv.ui.data.CardInfo;
import com.github.pedrovgs.tuentitv.ui.data.IconInfo;
import com.github.pedrovgs.tuentitv.ui.data.ImageInfo;
import com.github.pedrovgs.tuentitv.ui.navigator.Navigator;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.inject.Inject;
/**
* Class created to work as main view presenter. This presenter has all the responsibility related
* to the main view presentation logic: obtain a list of favorite contacts, obtain a list of recent
* conversations, show a list of all user's contacts sorted alphabetically.
*
* Main collaborators of this class ar Accounts, Agenda, MediaGallery and Chat. Collaborators
* needed
* to perform all the business/presentation logic related to this view.
*
* @author Pedro Vicente Gómez Sánchez.
*/
public class MainPresenter {
private final Accounts accounts;
private final Agenda agenda;
private final MediaGallery mediaGallery;
private final Chat chat;
private final Navigator navigator;
private View view;
@Inject
public MainPresenter(Accounts accounts, Agenda agenda, MediaGallery mediaGallery, Chat chat,
Navigator navigator) {
this.accounts = accounts;
this.agenda = agenda;
this.mediaGallery = mediaGallery;
this.chat = chat;
this.navigator = navigator;
}
public void setView(View view) {
this.view = view;
}
public void loadData() {
view.showDefaultBackground();
List<CardInfo> favorites = getFavoriteContacts();
List<CardInfo> conversations = getConversations();
List<CardInfo> contacts = getAllContacts();
List<ImageInfo> mediaElements = getAllMediaElements();
List<IconInfo> preferences = getPreferences();
view.showMainInformation(favorites, conversations, contacts, mediaElements, preferences);
}
public void onCardInfoSelected(CardInfo cardInfo) {
if (cardInfo != null) {
view.updateBackground(cardInfo.getSecondaryImage());
} else {
view.showDefaultBackground();
}
}
public void onCardInfoClicked(CardInfo item) {
view.cancelPendingBackgroundUpdates();
navigator.openDetailView(item.getId());
}
public void onImageInfoSelected(ImageInfo imageInfo) {
if (imageInfo != null) {
view.updateBackground(imageInfo.getImageUrl());
}
}
public void onImageInfoClicked(ImageInfo item) {
navigator.openImageView(item.getImageUrl());
}
public void onPreferencesSelected() {
view.showDefaultBackground();
}
public void onSearchIconClicked() {
navigator.openSearchView();
}
public void logout() {
accounts.logout();
navigator.openLoginView();
view.closeView();
}
private List<CardInfo> getFavoriteContacts() {
List<Contact> favorites = agenda.getFavorites();
return new LinkedList<CardInfo>(favorites);
}
private List<CardInfo> getConversations() {
List<ConversationSummary> conversations = chat.getRecentConversations();
return new ArrayList<CardInfo>(conversations);
}
private List<CardInfo> getAllContacts() {
List<Contact> contacts = agenda.getContacts();
return new ArrayList<CardInfo>(contacts);
}
private List<ImageInfo> getAllMediaElements() {
List<MediaElement> lastMediaElements = mediaGallery.getLatestMediaElements();
return new ArrayList<ImageInfo>(lastMediaElements);
}
private List<IconInfo> getPreferences() {
List<IconInfo> preferences = new LinkedList<IconInfo>();
preferences.add(new IconInfo(R.string.change_pattern, R.drawable.icn_settings_change_pattern));
preferences.add(new IconInfo(R.string.account, R.drawable.icn_settings_account));
preferences.add(new IconInfo(R.string.settings, R.drawable.icn_settings));
preferences.add(new IconInfo(R.string.close_session, R.drawable.icn_settings_log_out));
return preferences;
}
public interface View {
void updateBackground(String imageUrl);
void showMainInformation(List<CardInfo> favorites, List<CardInfo> conversations,
List<CardInfo> contacts, List<ImageInfo> mediaElements, List<IconInfo> preferences);
void showDefaultBackground();
void closeView();
void cancelPendingBackgroundUpdates();
}
}