package com.piusvelte.sonet.fragment;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import com.piusvelte.eidos.Eidos;
import com.piusvelte.sonet.OAuthLogin;
import com.piusvelte.sonet.R;
import com.piusvelte.sonet.Sonet;
import com.piusvelte.sonet.SonetService;
import com.piusvelte.sonet.adapter.AccountAdapter;
import com.piusvelte.sonet.loader.AccountsProfilesLoaderCallback;
import com.piusvelte.sonet.loader.DeleteAccountLoader;
import com.piusvelte.sonet.provider.Accounts;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static com.piusvelte.sonet.Sonet.ACTION_REFRESH;
/**
* Created by bemmanuel on 4/19/15.
*/
public class AccountsList extends ListFragment implements View.OnClickListener,
AccountsProfilesLoaderCallback.OnAccountsLoadedListener, LoaderManager.LoaderCallbacks<Boolean> {
private static final int LOADER_ACCOUNT_PROFILES = 0;
private static final int LOADER_ACCOUNT_DELETE = 1;
private static final int DELETE_ID = 0;
private static final String DIALOG_ADD_ACCOUNT = "dialog:add_account";
private static final String FRAGMENT_ACCOUNT_DETAIL = "fragment:account_detail";
private static final int REQUEST_ADD_ACCOUNT = 0;
private static final int REQUEST_REFRESH = 1;
private static final String ARG_ACCOUNT_ID = "account_id";
private static final String ARG_SERVICE = "service";
private static final String ARG_SERVICE_ID = "service_id";
private List<HashMap<String, String>> mAccounts = new ArrayList<>();
private AccountAdapter mAdapter;
private FloatingActionButton mFloatingActionButton;
public static AccountsList newInstance() {
return new AccountsList();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.accounts, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
registerForContextMenu(getListView());
mFloatingActionButton = (FloatingActionButton) view.findViewById(R.id.fab);
mFloatingActionButton.setOnClickListener(this);
mAdapter = new AccountAdapter(getActivity(), mAccounts);
setListAdapter(mAdapter);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(LOADER_ACCOUNT_PROFILES,
null,
new AccountsProfilesLoaderCallback(this, LOADER_ACCOUNT_PROFILES));
}
@Override
public void onResume() {
super.onResume();
setFABVisibility();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isResumed() && !isRemoving()) {
setFABVisibility();
}
}
private void setFABVisibility() {
if (getUserVisibleHint()) {
if (mFloatingActionButton.getVisibility() != View.VISIBLE) {
mFloatingActionButton.setTranslationY(getResources().getDimension(R.dimen.fab_animation_height));
mFloatingActionButton.setVisibility(View.VISIBLE);
mFloatingActionButton.animate()
.translationY(0)
.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
.start();
}
} else if (mFloatingActionButton.getVisibility() == View.VISIBLE) {
mFloatingActionButton.setVisibility(View.GONE);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, DELETE_ID, 0, R.string.delete_account);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case DELETE_ID:
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
HashMap<String, String> account = mAccounts.get(menuInfo.position);
Bundle args = new Bundle();
args.putLong(ARG_ACCOUNT_ID, menuInfo.id);
args.putInt(ARG_SERVICE, Integer.parseInt(account.get(Accounts.SERVICE)));
args.putString(ARG_SERVICE_ID, account.get(Accounts.SID));
getLoaderManager().restartLoader(LOADER_ACCOUNT_DELETE, args, this);
return true;
default:
return super.onContextItemSelected(item);
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
HashMap<String, String> account = mAdapter.getItem(position);
getFragmentManager().beginTransaction()
.add(R.id.fragment_container,
Settings.newInstance(AccountAdapter.getAccountId(account),
AccountAdapter.getAccountService(account),
AccountAdapter.getAccountProfileUrl(account),
AccountAdapter.getAccountUsername(account)),
FRAGMENT_ACCOUNT_DETAIL)
.addToBackStack(null)
.commit();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_ADD_ACCOUNT:
if (resultCode == Activity.RESULT_OK) {
int service = Integer.parseInt(getResources().getStringArray(R.array.service_values)[ItemsDialogFragment.getWhich(data, 0)]);
startActivityForResult(new Intent(getActivity(), OAuthLogin.class)
.putExtra(Accounts.SERVICE, service)
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
.putExtra(Sonet.EXTRA_ACCOUNT_ID, Sonet.INVALID_ACCOUNT_ID)
, REQUEST_REFRESH);
}
break;
case REQUEST_REFRESH:
if (resultCode == Activity.RESULT_OK) {
refresh();
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
private void refresh() {
Eidos.requestBackup(getActivity());
getActivity().startService(new Intent(getActivity(), SonetService.class)
.setAction(ACTION_REFRESH)
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { AppWidgetManager.INVALID_APPWIDGET_ID }));
getLoaderManager().restartLoader(LOADER_ACCOUNT_PROFILES,
null,
new AccountsProfilesLoaderCallback(this, LOADER_ACCOUNT_PROFILES));
}
@Override
public void onClick(View v) {
if (v == mFloatingActionButton) {
// add a new account
String[] services = getResources().getStringArray(R.array.service_entries);
ItemsDialogFragment.newInstance(services, REQUEST_ADD_ACCOUNT)
.show(getChildFragmentManager(), DIALOG_ADD_ACCOUNT);
}
}
@Override
public Context getContext() {
return getActivity();
}
@Override
public void onAccountsLoaded(List<HashMap<String, String>> accounts) {
mAccounts.clear();
if (accounts != null) {
mAccounts.addAll(accounts);
}
mAdapter.notifyDataSetChanged();
}
@Override
public Loader<Boolean> onCreateLoader(int id, Bundle args) {
switch (id) {
case LOADER_ACCOUNT_DELETE:
return new DeleteAccountLoader(getActivity(),
args.getLong(ARG_ACCOUNT_ID),
args.getInt(ARG_SERVICE),
args.getString(ARG_SERVICE_ID));
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Boolean> loader, Boolean data) {
switch (loader.getId()) {
case LOADER_ACCOUNT_DELETE:
// NO-OP
break;
}
}
@Override
public void onLoaderReset(Loader<Boolean> loader) {
// NO-OP
}
}