package com.limemobile.app.launcher.view;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.view.View.OnClickListener;
import android.widget.TextView;
import com.limemobile.app.launcher.activity.Launcher;
import com.limemobile.app.launcher.entity.ApplicationInfo;
import com.limemobile.app.launcher.receiver.LauncherModel;
import com.limemobile.app.launcher.wp8.R;
import java.util.ArrayList;
import java.util.Collections;
public class SearchAppsView extends LinearLayout implements OnItemClickListener, OnItemLongClickListener, DragSource, TextWatcher, OnClickListener {
private static final String TAG = "Launcher.AllAppsLetterFilter";
private static final boolean DEBUG = false;
private Launcher mLauncher;
private DragController mDragController;
private ListView mList;
private EditText mSearchInput;
private TextView mPlayStoreSearch;
private ArrayList<ApplicationInfo> mAllAppsList = new ArrayList<ApplicationInfo>();
private ArrayList<ApplicationInfo> mSearchedAppsList = new ArrayList<ApplicationInfo>();
private AppsAdapter mAppsAdapter;
public class AppsAdapter extends ArrayAdapter<ApplicationInfo> {
private final LayoutInflater mInflater;
public AppsAdapter(Context context, ArrayList<ApplicationInfo> apps) {
super(context, 0, apps);
mInflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ApplicationInfo info = getItem(position);
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.application_list, parent, false);
holder = new ViewHolder();
holder.description = (TextView) convertView.findViewById(R.id.description);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.description.setVisibility(View.GONE);
info.iconBitmap.setDensity(Bitmap.DENSITY_NONE);
holder.icon.setImageBitmap(info.iconBitmap);
holder.name.setText(info.title);
return convertView;
}
class ViewHolder {
ImageView icon;
TextView name;
TextView description;
}
}
public SearchAppsView(Context context, AttributeSet attrs) {
super(context, attrs);
setVisibility(View.GONE);
setSoundEffectsEnabled(false);
setHapticFeedbackEnabled(false);
mAppsAdapter = new AppsAdapter(getContext(), mSearchedAppsList);
mAppsAdapter.setNotifyOnChange(false);
}
@Override
protected void onFinishInflate() {
setBackgroundColor(Color.BLACK);
try {
mList = (ListView)findViewWithTag("search_app_list");
if (mList == null) throw new Resources.NotFoundException();
mSearchInput = (EditText) findViewWithTag("searchString");
if (mSearchInput == null) throw new Resources.NotFoundException();
mSearchInput.addTextChangedListener(this);
mPlayStoreSearch = (TextView) findViewById(R.id.playStoreSearch);
mPlayStoreSearch.setVisibility(View.GONE);
mPlayStoreSearch.setOnClickListener(this);
mList.setOnItemClickListener(this);
mList.setOnItemLongClickListener(this);
mList.setBackgroundColor(Color.BLACK);
mList.setCacheColorHint(Color.BLACK);
mList.setAdapter(mAppsAdapter);
} catch (Resources.NotFoundException e) {
if (DEBUG)
Log.e(TAG, "Can't find necessary layout elements for AllAppsLetterFilter");
}
}
public void setLauncher(Launcher launcher) {
mLauncher = launcher;
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
ApplicationInfo app = (ApplicationInfo) parent.getItemAtPosition(position);
if (mLauncher != null)
mLauncher.startActivitySafely(app.intent, app);
}
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (!view.isInTouchMode()) {
return false;
}
ApplicationInfo app = (ApplicationInfo) parent.getItemAtPosition(position);
app = new ApplicationInfo(app);
if (mDragController != null)
mDragController.startDrag(view, this, app, DragController.DRAG_ACTION_COPY);
if (mLauncher != null)
mLauncher.closeAllApps(true);
return true;
}
protected void onFocusChanged(boolean gainFocus, int direction, android.graphics.Rect prev) {
if (gainFocus) {
mList.requestFocus();
}
}
public void setDragController(DragController dragger) {
mDragController = dragger;
}
public void onDropCompleted(View target, boolean success) {
}
public void setApps(ArrayList<ApplicationInfo> list) {
mAllAppsList.clear();
addApps(list);
}
public void addApps(ArrayList<ApplicationInfo> list) {
// Log.d(TAG, "addApps: " + list.size() + " apps: " + list.toString());
final int N = list.size();
for (int i=0; i<N; i++) {
final ApplicationInfo item = list.get(i);
int index = Collections.binarySearch(mAllAppsList, item,
LauncherModel.APP_NAME_COMPARATOR);
if (index < 0) {
index = -(index+1);
}
mAllAppsList.add(index, item);
}
updateSearchResult(mSearchInput.getText().toString());
mAppsAdapter.notifyDataSetChanged();
}
private void updateSearchResult(String seachText) {
mSearchedAppsList.clear();
for (ApplicationInfo info : mAllAppsList) {
if (TextUtils.isEmpty(seachText) || info.title.toString().toLowerCase().contains(seachText.toLowerCase()))
mSearchedAppsList.add(info);
}
if (mSearchedAppsList.isEmpty() && !TextUtils.isEmpty(seachText)) {
mPlayStoreSearch.setVisibility(View.VISIBLE);
mList.setVisibility(View.GONE);
} else {
mPlayStoreSearch.setVisibility(View.GONE);
mList.setVisibility(View.VISIBLE);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
updateSearchResult(s.toString());
mAppsAdapter.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.playStoreSearch) {
String searchText = mSearchInput.getText().toString();
if (!TextUtils.isEmpty(searchText)) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://search?q=" + searchText));
if (mLauncher != null)
mLauncher.startActivitySafely(intent, null);
}
}
}
}