/*
 * Copyright 2012 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.android.apps.mytracks.util;

import com.google.android.apps.mytracks.ContextualActionModeCallback;
import com.google.android.apps.mytracks.TrackController;
import com.google.android.maps.mytracks.R;

import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TabWidget;

import java.util.ArrayList;
import java.util.List;

/**
 * API level 11 specific implementation of the {@link ApiAdapter}.
 * 
 * @author Jimmy Shih
 */
@TargetApi(11)
public class Api11Adapter extends Api10Adapter {

  @Override
  public void hideTitle(Activity activity) {
    // Do nothing
  }

  @Override
  public void configureActionBarHomeAsUp(Activity activity) {
    ActionBar actionBar = activity.getActionBar();
    if (actionBar != null) {
      actionBar.setDisplayHomeAsUpEnabled(true);
    }
  }

  @Override
  public void configureListViewContextualMenu(final Activity activity, final ListView listView,
      final ContextualActionModeCallback contextualActionModeCallback) {
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

        @Override
      public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.getMenuInflater().inflate(R.menu.list_context_menu, menu);
        return true;
      }

        @Override
      public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        contextualActionModeCallback.onPrepare(
            menu, getCheckedPositions(listView), listView.getCheckedItemIds(), true);
        return true;
      }

        @Override
      public void onDestroyActionMode(ActionMode mode) {
        // Do nothing
      }

        @Override
      public void onItemCheckedStateChanged(
          ActionMode mode, int position, long id, boolean checked) {
        mode.invalidate();
      }

        @Override
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        if (contextualActionModeCallback.onClick(
            item.getItemId(), getCheckedPositions(listView), listView.getCheckedItemIds())) {
          mode.finish();
        }
        return true;
      }       
     
      /**
       * Gets the checked positions in a list view.
       * 
       * @param list the list view
       */
      private int[] getCheckedPositions(ListView list) {
        SparseBooleanArray positions  = list.getCheckedItemPositions();
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        for (int i = 0; i < positions.size(); i++) {
          int key = positions.keyAt(i);
          if (positions.valueAt(i)) {
            arrayList.add(key);
          }
        }
        int[] result = new int[arrayList.size()];
        for (int i = 0; i < arrayList.size(); i++) {
          result[i] = arrayList.get(i);
        }
        return result;
      }
    });
  }

  @Override
  public void configureSearchWidget(
      Activity activity, MenuItem menuItem, final TrackController trackController) {
    SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menuItem.getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(activity.getComponentName()));
    searchView.setQueryRefinementEnabled(true);
    searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
      
        @Override
      public void onFocusChange(View v, boolean hasFocus) {
          // Hide and show trackController when search widget has focus/no focus
          if (trackController != null) {
            if (hasFocus) {
              trackController.hide();
            } else {
              trackController.show();
            }
          }        
      }
    });
  }

  @Override
  public boolean handleSearchMenuSelection(Activity activity) {
    // Returns false to allow the platform to expand the search widget.
    return false;
  }

  @Override
  public <T> void addAllToArrayAdapter(ArrayAdapter<T> arrayAdapter, List<T> items) {
    arrayAdapter.addAll(items);
  }

  @Override
  public void invalidMenu(Activity activity) {
    activity.invalidateOptionsMenu();
  }
  
  @Override
  public void setTabBackground(TabWidget tabWidget) {
    for (int i = 0; i < tabWidget.getChildCount(); i++) {
      tabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_indicator_mytracks);
    }
  }
  
  @Override
  public boolean hasDialogTitleDivider() {
    return true;
  }
  
  @Override
  public void setTitleAndSubtitle(Activity activity, String title, String subtitle) {
    ActionBar actionBar = activity.getActionBar();
    actionBar.setTitle(title);
    actionBar.setSubtitle(subtitle);
  }  
}