package info.justaway;
import android.app.ActionBar;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.TextView;
import java.util.ArrayList;
import butterknife.ButterKnife;
import butterknife.Bind;
import info.justaway.model.TabManager;
import info.justaway.util.ThemeUtil;
import info.justaway.widget.FontelloTextView;
public class TabSettingsActivity extends FragmentActivity {
private static final int REQUEST_CHOOSE_USER_LIST = 100;
private static final int HIGH_LIGHT_COLOR = Color.parseColor("#9933b5e5");
private static final int DEFAULT_COLOR = Color.TRANSPARENT;
private TabAdapter mAdapter;
private ListView mListView;
private TabManager.Tab mDragTab;
private boolean mSortable = false;
private int mToPosition;
private boolean mRemoveMode = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ThemeUtil.setTheme(this);
setContentView(R.layout.activity_tab_settings);
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
mListView = (ListView) findViewById(R.id.list);
mAdapter = new TabAdapter(this, R.layout.row_tag);
for (TabManager.Tab tab : TabManager.loadTabs()) {
mAdapter.add(tab);
}
mListView.setAdapter(mAdapter);
mListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (!mSortable) {
return false;
}
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: {
break;
}
case MotionEvent.ACTION_MOVE: {
int position = mListView.pointToPosition((int) motionEvent.getX(), (int) motionEvent.getY());
if (position < 0) {
break;
}
if (position != mToPosition) {
mToPosition = position;
mAdapter.remove(mDragTab);
mAdapter.insert(mDragTab, mToPosition);
}
return true;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE: {
mAdapter.setCurrentTab(null);
mSortable = false;
return true;
}
}
return false;
}
});
Switch modeSwitch = (Switch) findViewById(R.id.mode_switch);
modeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
mRemoveMode = b;
mAdapter.notifyDataSetChanged();
}
});
findViewById(R.id.button_cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(RESULT_CANCELED);
finish();
}
});
findViewById(R.id.button_save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TabManager.saveTabs(mAdapter.getTabs());
setResult(RESULT_OK);
finish();
}
});
}
public void startDrag(TabManager.Tab tab) {
mDragTab = tab;
mToPosition = 0;
mSortable = true;
mAdapter.setCurrentTab(mDragTab);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.tab_setting, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem homeMenuItem = menu.findItem(R.id.menu_add_home_tab);
if (homeMenuItem != null) {
homeMenuItem.setVisible(!mAdapter.hasTabId(TabManager.TIMELINE_TAB_ID));
}
MenuItem interactionsMenuItem = menu.findItem(R.id.menu_add_interactions_tab);
if (interactionsMenuItem != null) {
interactionsMenuItem.setVisible(!mAdapter.hasTabId(TabManager.INTERACTIONS_TAB_ID));
}
MenuItem directMessagesMenuItem = menu.findItem(R.id.menu_add_direct_messages_tab);
if (directMessagesMenuItem != null) {
directMessagesMenuItem.setVisible(!mAdapter.hasTabId(TabManager.DIRECT_MESSAGES_TAB_ID));
}
MenuItem favoritesMenuItem = menu.findItem(R.id.menu_add_favorites_tab);
if (favoritesMenuItem != null) {
favoritesMenuItem.setVisible(!mAdapter.hasTabId(TabManager.FAVORITES_TAB_ID));
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
case R.id.menu_add_home_tab:
mAdapter.insert(new TabManager.Tab(TabManager.TIMELINE_TAB_ID), 0);
break;
case R.id.menu_add_interactions_tab:
mAdapter.insert(new TabManager.Tab(TabManager.INTERACTIONS_TAB_ID), 0);
break;
case R.id.menu_add_direct_messages_tab:
mAdapter.insert(new TabManager.Tab(TabManager.DIRECT_MESSAGES_TAB_ID), 0);
break;
case R.id.menu_add_favorites_tab:
mAdapter.insert(new TabManager.Tab(TabManager.FAVORITES_TAB_ID), 0);
break;
case R.id.menu_user_list_tab:
TabManager.saveTabs(mAdapter.getTabs());
Intent intent = new Intent(this, ChooseUserListsActivity.class);
setResult(RESULT_OK);
startActivityForResult(intent, REQUEST_CHOOSE_USER_LIST);
break;
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CHOOSE_USER_LIST:
if (resultCode == RESULT_OK) {
mAdapter.clear();
for (TabManager.Tab tab : TabManager.loadTabs()) {
mAdapter.add(tab);
}
mAdapter.notifyDataSetChanged();
mListView.invalidateViews();
setResult(RESULT_OK);
}
break;
}
}
public class TabAdapter extends ArrayAdapter<TabManager.Tab> {
class ViewHolder {
@Bind(R.id.handle) FontelloTextView mHandle;
@Bind(R.id.tab_icon) FontelloTextView mTabIcon;
@Bind(R.id.name) TextView mName;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
private ArrayList<TabManager.Tab> mTabs = new ArrayList<>();
private LayoutInflater mInflater;
private int mLayout;
private TabManager.Tab mCurrentTab;
public TabAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.mLayout = textViewResourceId;
}
public void setCurrentTab(TabManager.Tab tab) {
mCurrentTab = tab;
notifyDataSetChanged();
}
public ArrayList<TabManager.Tab> getTabs() {
return mTabs;
}
@Override
public void add(TabManager.Tab tab) {
super.add(tab);
mTabs.add(tab);
}
@Override
public void insert(TabManager.Tab tab, int position) {
super.insert(tab, position);
mTabs.add(position, tab);
}
@Override
public void remove(TabManager.Tab tab) {
super.remove(tab);
mTabs.remove(tab);
}
@Override
public void clear() {
super.clear();
mTabs.clear();
}
public boolean hasTabId(Long tabId) {
for (TabManager.Tab tab : mTabs) {
if (tab.id.equals(tabId)) {
return true;
}
}
return false;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
// ビューを受け取る
View view = convertView;
if (view == null) {
// 受け取ったビューがnullなら新しくビューを生成
view = mInflater.inflate(this.mLayout, null);
if (view == null) {
return null;
}
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
final TabManager.Tab tab = mTabs.get(position);
viewHolder.mTabIcon.setText(tab.getIcon());
viewHolder.mName.setText(tab.getName());
if (mRemoveMode) {
viewHolder.mHandle.setText(R.string.fontello_trash);
viewHolder.mHandle.setOnTouchListener(null);
viewHolder.mHandle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mAdapter.remove(tab);
}
});
} else {
viewHolder.mHandle.setText(R.string.fontello_menu);
viewHolder.mHandle.setOnClickListener(null);
viewHolder.mHandle.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
startDrag(tab);
return true;
}
return false;
}
});
}
if (mCurrentTab != null && mCurrentTab == tab) {
view.setBackgroundColor(HIGH_LIGHT_COLOR);
} else {
view.setBackgroundColor(DEFAULT_COLOR);
}
return view;
}
}
}