/*
* Copyright (c) 2016 Google Inc.
*
* 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.samples.apps.iosched.navigation;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import com.google.samples.apps.iosched.archframework.PresenterImpl;
import com.google.samples.apps.iosched.archframework.UpdatableView;
import com.google.samples.apps.iosched.login.LoginStateListener;
import com.google.samples.apps.iosched.navigation.NavigationModel.NavigationItemEnum;
import com.google.samples.apps.iosched.navigation.NavigationModel.NavigationQueryEnum;
import com.google.samples.apps.iosched.navigation.NavigationModel.NavigationUserActionEnum;
import com.google.samples.apps.iosched.util.ActivityUtils;
/**
* This abstract class implements both {@link UpdatableView} and {@link AppNavigationView}, without
* any specific UI implementation details. This uses the {@link com.google.samples.apps.iosched
* .archframework} for getting its data and processing user actions. Some methods which are UI
* specific are left abstract. Extend this class for full navigation functionality.
*/
public abstract class AppNavigationViewAbstractImpl implements
UpdatableView<NavigationModel, NavigationQueryEnum, NavigationUserActionEnum>,
AppNavigationView {
private UserActionListener mUserActionListener;
protected LoginStateListener mLoginStateListener;
protected Activity mActivity;
protected NavigationItemEnum mSelfItem;
@Override
public void displayData(final NavigationModel model,
final NavigationModel.NavigationQueryEnum query) {
switch (query) {
case LOAD_ITEMS:
displayNavigationItems(model.getItems());
break;
}
}
@Override
public void displayErrorMessage(final NavigationModel.NavigationQueryEnum query) {
switch (query) {
case LOAD_ITEMS:
// No error message displayed
break;
}
}
@Override
public void activityReady(Activity activity, LoginStateListener loginStateListener,
NavigationItemEnum self) {
mActivity = activity;
mLoginStateListener = loginStateListener;
mSelfItem = self;
setUpView();
NavigationModel model = new NavigationModel(getContext());
PresenterImpl presenter = new PresenterImpl(model, this,
NavigationUserActionEnum.values(), NavigationQueryEnum.values());
presenter.loadInitialQueries();
addListener(presenter);
}
@Override
public void updateNavigationItems() {
mUserActionListener.onUserAction(NavigationUserActionEnum.RELOAD_ITEMS, null);
}
@Override
public abstract void displayNavigationItems(final NavigationItemEnum[] items);
@Override
public abstract void setUpView();
@Override
public abstract void showNavigation();
@Override
public void itemSelected(final NavigationItemEnum item) {
switch (item) {
case SIGN_IN:
mLoginStateListener.onSignInOrCreateAccount();
break;
default:
if (item.getClassToLaunch() != null) {
ActivityUtils.createBackStack(mActivity,
new Intent(mActivity, item.getClassToLaunch()));
if (item.finishCurrentActivity()) {
mActivity.finish();
}
}
break;
}
}
@Override
public void displayUserActionResult(final NavigationModel model,
final NavigationModel.NavigationUserActionEnum userAction, final boolean success) {
switch (userAction) {
case RELOAD_ITEMS:
displayNavigationItems(model.getItems());
break;
}
}
@Override
public Uri getDataUri(final NavigationModel.NavigationQueryEnum query) {
// This feature has no Uri
return null;
}
@Override
public Context getContext() {
return mActivity;
}
@Override
public void addListener(final UserActionListener listener) {
mUserActionListener = listener;
}
}