package io.codetail.sources;
import android.accounts.Account;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.TextUtils;
import com.telly.mrvector.MrVector;
import java.util.List;
import codetail.utils.ResourceUtils;
import io.codetail.Constants;
import io.codetail.WatchMeActivity;
import io.codetail.client.auth.Authenticator;
import io.codetail.client.mover.MoverAuthenticator;
import io.codetail.client.mover.MoverService;
import io.codetail.fragments.BaseWatchMeFragment;
import io.codetail.fragments.mover.CategoryFragment;
import io.codetail.fragments.mover.SearchFragment;
import io.codetail.watchme.R;
import io.codetail.work.JobManager;
import retrofit.RestAdapter;
public final class MoverSource extends Source{
public static MoverService sService;
final static String CATEGORY_FRAGMENT = "moverCategoryFragment";
final static String SEARCH_FRAGMENT = "moverSearchFragment";
CharSequence[] mNavigationCategories;
Drawable[] mNavigationDrawables;
MoverAuthenticator mAuthenticator;
public MoverSource() {
sService = new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.BASIC)
.setEndpoint(MoverService.ENDPOINT)
.setClient(Constants.getOkClient())
.build()
.create(MoverService.class);
mNavigationCategories = null;
mNavigationDrawables = null;
mAuthenticator = new MoverAuthenticator(sService);
}
@Override
public String getSourceId() {
return "codetail.auth.UZ_MOVER";
}
@Override
public String getAuthToken(Account account, String password) {
return null;
}
@Override
public String getLabel() {
return ResourceUtils.getString(R.string.uz_mover_source_label);
}
@Override
public Authenticator getAuthenticator() {
return mAuthenticator;
}
@Override
public boolean isValidAuthToken(String token) {
return false;
}
@Override
public CharSequence[] getNavigationItems() {
if(mNavigationCategories == null) {
mNavigationCategories = ResourceUtils.getTextArray(R.array.main_categories_list);
}
return mNavigationCategories;
}
@Override
public Drawable[] getNavigationIcons() {
if(mNavigationDrawables == null){
Resources resources = ResourceUtils.getResources();
TypedArray array = resources.obtainTypedArray(R.array.mover_categories_icons);
final int length = array.length();
Drawable[] drawables = new Drawable[length];
for(int index = 0; index < length; index++){
drawables[index] = MrVector.inflate(resources, array.getResourceId(index, -1));
}
array.recycle();
mNavigationDrawables = drawables;
}
return mNavigationDrawables;
}
@Override
public void onNavigationItemSelected(FragmentManager manager, int position) {
CategoryFragment fragment = (CategoryFragment) manager.findFragmentByTag(CATEGORY_FRAGMENT);
if(fragment == null){
throw new RuntimeException("Strange statement, CategoryFragment is not in fragments stack");
}
if(fragment.isDetached()){
throw new IllegalStateException("CategoryFragment is detached");
}
fragment.setSelected(position);
}
@Override
public BaseWatchMeFragment openDefaultFragment(FragmentManager manager, boolean addToBackStack) {
if (addToBackStack) {
return openFragment(manager, new CategoryFragment(), null, CATEGORY_FRAGMENT);
}
return openFragmentWithoutAddingBackStack(manager, new CategoryFragment(), null, CATEGORY_FRAGMENT);
}
@Override
public BaseWatchMeFragment openSearchFragment(FragmentManager manager) {
return openFragment(manager, new SearchFragment(), null, SEARCH_FRAGMENT);
}
@Override
public boolean onIntentCatched(WatchMeActivity activity, JobManager manager, Uri url) {
if(!"mover.uz".equals(url.getHost()) && !"www.mover.uz".equals(url.getHost())){
return false;
}
FragmentManager fragmentManager = activity.getSupportFragmentManager();
List<String> pathSegments = url.getPathSegments();
String fragment2open = pathSegments.size() >= 1 ? pathSegments.get(0) : "doNothing";
if(pathSegments.size() == 0){
fragment2open = "home";
}
Bundle arguments = new Bundle();
String tagName;
BaseWatchMeFragment target;
switch (fragment2open){
case "search":
target = new SearchFragment();
tagName = SEARCH_FRAGMENT;
String query = url.getQueryParameter("val");
int pageNumber = getPageNumber(url.getQueryParameter("page"));
//TODO support search filters
arguments.putString(SearchFragment.SEARCH_QUERY, query);
arguments.putInt(SearchFragment.SEARCH_CURRENT_PAGE, pageNumber);
break;
case "watch":
//FIXME temporary decision
target = new CategoryFragment();
tagName = CATEGORY_FRAGMENT;
arguments.putString("watchId", pathSegments.get( pathSegments.size() - 1 ));
break;
case "video":
target = new CategoryFragment();
tagName = CATEGORY_FRAGMENT;
String category = pathSegments.get(1);
pageNumber = getPageNumber(url.getQueryParameter("page"));
arguments.putString(CategoryFragment.SELECTED_CATEGORY, category);
arguments.putInt(CategoryFragment.CURRENT_PAGE, pageNumber);
break;
case "home":
target = new CategoryFragment();
tagName = CATEGORY_FRAGMENT;
arguments = null;
break;
case "doNothing": // Unsupported link
default:
return false;
}
openFragment(fragmentManager, target, arguments, tagName);
return true;
}
/**
* Replace current fragment with new one,
* plus adds it to back stack, then commit
*
* @param manager Fragment manager
* @param fragment fragment to open
* @param args target arguments
* @param name target id
*
* @return target
*/
private BaseWatchMeFragment openFragment(FragmentManager manager,
BaseWatchMeFragment fragment,
Bundle args, String name){
if(args != null){
fragment.setArguments(args);
}
manager.beginTransaction()
.replace(R.id.container, fragment, name)
.addToBackStack(name)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
return fragment;
}
/**
* Replace current fragment with new one then commit
*
* @param manager Fragment manager
* @param fragment fragment to open
* @param args target arguments
* @param name target id
*
* @return target
*/
private BaseWatchMeFragment openFragmentWithoutAddingBackStack(FragmentManager manager,
BaseWatchMeFragment fragment,
Bundle args, String name){
if(args != null){
fragment.setArguments(args);
}
manager.beginTransaction()
.replace(R.id.container, fragment, name)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
return fragment;
}
/**
* Parse string to find integers
*
* @param value Destination of integers
* @return parsed integers in given argument
*/
static int getPageNumber(String value){
int pageNumber = 1;
if(!TextUtils.isEmpty(value)){
pageNumber = Integer.getInteger(value, pageNumber);
}
return pageNumber;
}
}