1/*
2 * Copyright (C) 2012 Google Inc.
3 * Licensed to The Android Open Source Project.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.mail.browse;
19
20import android.content.Context;
21import android.net.Uri;
22import android.os.Bundle;
23import android.util.AttributeSet;
24import android.view.View;
25import android.widget.LinearLayout;
26
27import com.android.mail.R;
28import com.android.mail.providers.Folder;
29import com.android.mail.providers.UIProvider;
30
31public final class ConversationListFooterView extends LinearLayout implements View.OnClickListener {
32
33    public interface FooterViewClickListener {
34        void onFooterViewLoadMoreClick(Folder folder);
35    }
36
37    private View mLoading;
38    private View mLoadMore;
39    private Uri mLoadMoreUri;
40    private FooterViewClickListener mClickListener;
41
42    public ConversationListFooterView(Context context, AttributeSet attrs) {
43        super(context, attrs);
44    }
45
46    @Override
47    protected void onFinishInflate() {
48        super.onFinishInflate();
49
50        mLoading = findViewById(R.id.loading);
51        mLoadMore = findViewById(R.id.load_more);
52        mLoadMore.setOnClickListener(this);
53    }
54
55    public void setClickListener(FooterViewClickListener listener) {
56        mClickListener = listener;
57    }
58
59    @Override
60    public void onClick(View v) {
61        final int id = v.getId();
62        final Folder f = (Folder) v.getTag();
63        if (id == R.id.load_more) {
64            mClickListener.onFooterViewLoadMoreClick(f);
65        }
66    }
67
68    public void setFolder(Folder folder) {
69        mLoadMore.setTag(folder);
70        mLoadMoreUri = folder.loadMoreUri;
71    }
72
73    /**
74     * Update the view to reflect the new folder status.
75     */
76    public boolean updateStatus(final ConversationCursor cursor) {
77        if (cursor == null) {
78            mLoading.setVisibility(View.GONE);
79            mLoadMore.setVisibility(View.GONE);
80            return false;
81        }
82        boolean showFooter = true;
83        final Bundle extras = cursor.getExtras();
84        final int cursorStatus = extras.getInt(UIProvider.CursorExtraKeys.EXTRA_STATUS);
85        final int totalCount = extras.getInt(UIProvider.CursorExtraKeys.EXTRA_TOTAL_COUNT);
86
87        if (UIProvider.CursorStatus.isWaitingForResults(cursorStatus)) {
88            if (cursor.getCount() != 0) {
89                // When loading more, show the spinner in the footer.
90                mLoading.setVisibility(View.VISIBLE);
91                mLoadMore.setVisibility(View.GONE);
92            } else {
93                // We're currently loading, but we have no messages at all. We don't need to show
94                // the footer, because we should be displaying the loading state on the
95                // conversation list itself.
96                showFooter = false;
97            }
98
99        } else if (mLoadMoreUri != null && cursor.getCount() < totalCount) {
100            // We know that there are more messages on the server than we have locally, so we
101            // need to show the footer with the "load more" button.
102            mLoading.setVisibility(View.GONE);
103            mLoadMore.setVisibility(View.VISIBLE);
104        } else {
105            showFooter = false;
106        }
107        return showFooter;
108    }
109}
110