ArtistInfoView.java

/**
 * Copyright (c) 2013 Nokia Corporation. All rights reserved. Nokia and Nokia
 * Connecting People are registered trademarks of Nokia Corporation. Oracle and
 * Java are trademarks or registered trademarks of Oracle and/or its affiliates.
 * Other product and company names mentioned herein may be trademarks or trade
 * names of their respective owners. See LICENSE.TXT for license information.
 */

package com.nokia.example.musicexplorer.ui;

import org.json.me.JSONArray;
import org.json.me.JSONException;
import org.json.me.JSONObject;
import org.tantalum.Task;
import org.tantalum.util.L;

import com.nokia.example.musicexplorer.data.ApiCache;
import com.nokia.example.musicexplorer.data.model.ArtistModel;

/**
 * Implements the artist view.
 */
public class ArtistInfoView extends AlbumGridView {

    private ArtistModel artistModel;
    private ListItem headerItem;
    private ArtistView artistView;
    private int artistId = 0;

    /**
     * Constructor.
     * @param viewManager
     * @param artistModel
     */
    public ArtistInfoView(ViewManager viewManager, ArtistModel artistModel) {
        super(viewManager, null, false);
        
        this.artistModel = artistModel;
        
        initializeHeaderItem();
        loadDataset();
        appendItems();
    }

    /**
     * Constructor.
     * @param viewManager
     * @param artistId
     * @param artistView
     */
    public ArtistInfoView(ViewManager viewManager, int artistId, ArtistView artistView) {
        super(viewManager, null, false);
        this.artistView = artistView;
        this.artistId = artistId;
        getArtistDetailsById();
    }

    /**
     * @see com.nokia.example.musicexplorer.ui.AlbumGridView#notifyTotalUpdated()
     */
    protected void notifyTotalUpdated() {
        String text = Integer.toString(super.queryPager.getTotal()) + " albums";
        this.headerItem.setAlbumOrTrackAmountText(text);
    }

    /**
     * Used by the grid layout to fill itself with albums by the artist.
     * 
     * @see com.nokia.example.musicexplorer.ui.AlbumGridView#loadDataset()
     */
    protected void loadDataset() {
        if (this.artistModel != null) {
            ApiCache.getAlbumsForArtist(
                    this.artistModel.id,
                    new PlaceResultsTask(),
                    super.queryPager.getCurrentQueryString());
        }
    }

    /**
     * Used by the grid layout to load more albums by the artist.
     * 
     * @see com.nokia.example.musicexplorer.ui.AlbumGridView#loadNextDataset()
     */
    protected void loadNextDataset() {
        if (this.artistModel != null) {
            ApiCache.getAlbumsForArtist(
                    this.artistModel.id,
                    new PlaceResultsTask(),
                    super.queryPager.getQueryStringForNextPage());
        }
    }

    protected void getArtistDetailsById() {
        /*
         * Artist model is initialized in PlaceArtistTask.
         * After the model is initialized the rest of the view is constructed.
         */
        ApiCache.getArtistDetailsById(artistId, new PlaceArtistTask());
    }

    private void initializeHeaderItem() {
        if (artistModel != null && super.viewManager != null) {
            this.headerItem = new ListItem(super.viewManager, artistModel);
            this.headerItem.disablePointer();
        }
    }

    private void appendItems() {
        if (headerItem != null) {
            append(headerItem);
            appendGrid();
        }
    }

    /**
     * Implements a task which gets in a JSON response that needs to parsed to
     * an artist model.
     */
    protected class PlaceArtistTask extends Task {
        
        protected Object exec(Object response) {
            if (artistView != null && 
                    response != null && 
                    response instanceof JSONObject) {
                
                try {
                    // Response is first of items array {items:[{..}]}
                    JSONArray items = ((JSONObject) response).getJSONArray("items");
                    
                    if (items.length() > 0) {
                        // Get the first one. API should return only one result.
                        JSONObject artist = (JSONObject) items.get(0);
                        
                        artistModel = new ArtistModel(artist);
                        
                        /*
                         * Store the artist model to the ArtistView that was
                         * passed to the constructor.
                         */
                        artistView.setArtistModel(artistModel);
                        
                        /* 
                         * After the artist model is initialized, we can 
                         * continue to initialize the rest of the view.
                         */ 
                        initializeHeaderItem();
                        loadDataset();
                        appendItems();
                    }
                } catch (JSONException e) {
                    L.e("Could not parse artist model from JSON.", "", e);
                }
            } else {
                L.i("Response null or not JSONObject", response != null ? response.toString() : "is null");
            }
            
            return response;
        }
    }
}