blob: f5885aa2f73dd546ed1fecb9a070abf9bd80917d [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc.
* Licensed to The Android Open Source Project.
*
* 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.android.mail;
import android.content.UriMatcher;
import android.os.Bundle;
import android.text.TextUtils;
import com.android.mail.providers.Account;
import com.android.mail.providers.Folder;
import com.android.mail.providers.UIProvider;
import com.android.mail.utils.Utils;
import com.google.common.base.Preconditions;
/**
* This class is supposed to have the same thing that the Gmail ConversationListContext
* contained. For now, it has no implementation at all. The goal is to bring over functionality
* as required.
*
* Original purpose:
* An encapsulation over a request to a list of conversations and the various states around it.
* This includes the folder the user selected to view the list, or the search query for the
* list, etc.
*/
public class ConversationListContext {
public static final String EXTRA_SEARCH_QUERY = "query";
/**
* A matcher for data URI's that specify conversation list info.
*/
private static final UriMatcher sUrlMatcher = new UriMatcher(UriMatcher.NO_MATCH);
/**
* The account for whom we are showing a list
*/
public final Account account;
/**
* The folder whose conversations we are displaying, if any.
*/
public final Folder folder;
/**
* The search query whose results we are displaying, if any.
*/
public final String searchQuery;
static {
sUrlMatcher.addURI(UIProvider.AUTHORITY, "account/*/folder/*", 0);
}
/**
* De-serializes a context from a bundle.
*/
public static ConversationListContext forBundle(Bundle bundle) {
// The account is created here as a new object. This is probably not the best thing to do.
// We should probably be reading an account instance from our controller.
Account account = bundle.getParcelable(Utils.EXTRA_ACCOUNT);
Folder folder = bundle.getParcelable(Utils.EXTRA_FOLDER);
return new ConversationListContext(account, bundle.getString(EXTRA_SEARCH_QUERY), folder);
}
/**
* Builds a context for a view to a Gmail folder.
* @param account
* @param folder
* @return
*/
public static ConversationListContext forFolder(Account account, Folder folder) {
return new ConversationListContext(account, null, folder);
}
/**
* Builds a context object for viewing a conversation list for a search query.
*/
public static ConversationListContext forSearchQuery(Account account, Folder folder,
String query) {
return new ConversationListContext(account, Preconditions.checkNotNull(query), folder);
}
/**
* Internal constructor
*
* To create a class, use the static {@link #forFolder} or {@link #forBundle(Bundle)} method.
* @param a
* @param query
* @param f
*/
private ConversationListContext(Account a, String query, Folder f) {
account = a;
searchQuery = query;
folder = f;
}
/**
* Returns true if the provided context represents search results.
* @param in
* @return true the context represents search results. False otherwise
*/
public static final boolean isSearchResult(ConversationListContext in) {
return in != null && !TextUtils.isEmpty(in.searchQuery);
}
/**
* Serializes the context to a bundle.
*/
public Bundle toBundle() {
Bundle result = new Bundle();
result.putParcelable(Utils.EXTRA_ACCOUNT, account);
result.putString(EXTRA_SEARCH_QUERY, searchQuery);
result.putParcelable(Utils.EXTRA_FOLDER, folder);
return result;
}
}