blob: 7a44a2b624c2c324cff643ed4b51b53a796eec09 [file] [log] [blame]
// Copyright 2018 The Feed Authors.
//
// 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.google.android.libraries.feed.api.host.scheduler;
import android.support.annotation.IntDef;
/** Allows host to change behavior based on Feed requests and their status */
public interface SchedulerApi {
/**
* Define the request behavior of when a new session is created.
*
* <ul>
* <li>UNKNOWN - Default invalid value, this should not be returned.
* <li>REQUEST_WITH_WAIT - Make a request and then wait for it to complete before showing any
* content in the Stream.
* <li>REQUEST_WITH_CONTENT - Show the user the existing content and make a request. When the
* response completes, append the content below any content seen by the user, removing the
* old content below that level.
* <li>REQUEST_WITH_TIMEOUT - Make a request and if the response takes longer than the
* configured timeout, show existing content. When the response completes, the new content
* will be displayed below any content the user has viewed.
* <li>NO_REQUEST_WITH_WAIT - Show the current content, if an existing request is being made,
* wait for it to complete.
* <li>NO_REQUEST_WITH_CONTENT - Show the existing content, don't wait if a request is currently
* being made.
* <li>NO_REQUEST_WITH_TIMEOUT - Show the current content. If an existing request is being made,
* wait for the configured timeout for it to complete. When the response completes, the new
* content will be displayed below any content the user has viewed.
* </ul>
*
* <p>When adding new values, the value of {@link RequestBehavior#NEXT_VALUE} should be used and
* incremented. When removing values, {@link RequestBehavior#NEXT_VALUE} should not be changed,
* and those values should not be reused.
*/
@IntDef({
RequestBehavior.UNKNOWN,
RequestBehavior.REQUEST_WITH_WAIT,
RequestBehavior.REQUEST_WITH_CONTENT,
RequestBehavior.REQUEST_WITH_TIMEOUT,
RequestBehavior.NO_REQUEST_WITH_WAIT,
RequestBehavior.NO_REQUEST_WITH_CONTENT,
RequestBehavior.NO_REQUEST_WITH_TIMEOUT,
RequestBehavior.NEXT_VALUE,
})
@interface RequestBehavior {
int UNKNOWN = 0;
int REQUEST_WITH_WAIT = 1;
int REQUEST_WITH_CONTENT = 2;
int REQUEST_WITH_TIMEOUT = 3;
int NO_REQUEST_WITH_WAIT = 4;
int NO_REQUEST_WITH_CONTENT = 5;
int NO_REQUEST_WITH_TIMEOUT = 6;
int NEXT_VALUE = 7;
}
/** Object which contains the current state of the SessionManager. */
final class SessionManagerState {
/** Does the SessionManager have content? */
public final boolean hasContent;
/**
* Returns the date/time of when the content was added. This will only be set when {@code
* hasContent == true},
*/
public final long contentCreationDateTimeMs;
/** Is there an outstanding request being made? */
public final boolean hasOutstandingRequest;
public SessionManagerState(
boolean hasContent, long contentCreationDateTimeMs, boolean hasOutstandingRequest) {
this.hasContent = hasContent;
this.contentCreationDateTimeMs = contentCreationDateTimeMs;
this.hasOutstandingRequest = hasOutstandingRequest;
}
}
/** Called when a Session is created to determine what behavior we should implement. */
@RequestBehavior
int shouldSessionRequestData(SessionManagerState sessionManagerState);
/** Notify scheduler that new content has been received. */
void onReceiveNewContent(long contentCreationDateTimeMs);
/** Notify scheduler that an error occurred while handling a request. */
void onRequestError(int networkResponseCode);
}