package cn.koolcloud.ipos.appstore.ui;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import cn.koolcloud.ipos.appstore.AppStorePreference;
import cn.koolcloud.ipos.appstore.R;
import cn.koolcloud.ipos.appstore.adapter.GeneralAppsListAdapter;
import cn.koolcloud.ipos.appstore.api.ApiService;
import cn.koolcloud.ipos.appstore.constant.Constants;
import cn.koolcloud.ipos.appstore.download.database.DownloadDBOperator;
import cn.koolcloud.ipos.appstore.download.providers.Downloader;
import cn.koolcloud.ipos.appstore.entity.App;
import cn.koolcloud.ipos.appstore.entity.ResultSet;
import cn.koolcloud.ipos.appstore.interfaces.CallBack;
import cn.koolcloud.ipos.appstore.utils.Env;
import cn.koolcloud.ipos.appstore.utils.JsonUtils;
import cn.koolcloud.ipos.appstore.utils.Logger;
import cn.koolcloud.ipos.appstore.utils.ToastUtil;
import cn.koolcloud.ipos.appstore.utils.Utils;
import cn.koolcloud.ipos.appstore.views.AppStoreListView;
import cn.koolcloud.ipos.appstore.views.AppStoreListView.AppstoreListViewListener;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.widget.SearchView;
public class SearchActivity extends BaseActivity implements SearchView.OnQueryTextListener, SearchView.OnSuggestionListener, AppstoreListViewListener, OnItemClickListener {
private final static String TAG = "SearchActivity";
public final static int SEARCH_ACTIVITY_REQUEST = 3;
public static final int GENERAL_APPS_INSTALL_REQUEST = 1;
private static final int HANDLE_UPDATE_APP = 0;
private SearchView searchView; //search view in action bar
private ActionBar actionBar; //action bar
private boolean useLogo = false; //action bar logo
private boolean showHomeUp = true; //show home up in action bar
private Bundle mBundle;
private AppStoreListView generalListView; //the list view of apps
private List<App> appListDataSource = new ArrayList<App>(); //apps data source
private GeneralAppsListAdapter mAppListAdapter; //adapter for app list view
private String keyWord = "";
private static SearchActivity instance;
public static SearchActivity getInstance() {
return instance;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
setContentView(R.layout.search_list_grid);
mBundle = getIntent().getExtras();
keyWord = mBundle.getString(Constants.SEARCH_WORD_KEY);
activityList.add(this);
initActionBar();
initViews();
getAppsBySearchWord();
}
/**
* @Title: initActionBar
* @Description: Initialize Action Bar
* @param
* @return void
* @throws
*/
private void initActionBar() {
actionBar = getSupportActionBar();
// set defaults for logo & home up
actionBar.setDisplayHomeAsUpEnabled(showHomeUp);
actionBar.setDisplayUseLogoEnabled(useLogo);
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.title_bg));
actionBar.setIcon(R.drawable.logo);
actionBar.setTitle("\"" + keyWord + "\"" + Utils.getResourceString(application, R.string.search_activity_result));
// set up list nav
actionBar.setListNavigationCallbacks(ArrayAdapter.createFromResource(this, R.array.sections,
R.layout.sherlock_spinner_dropdown_item),
new OnNavigationListener() {
public boolean onNavigationItemSelected(int itemPosition,
long itemId) {
// FIXME add proper implementation
return false;
}
});
}
private void initViews() {
generalListView = (AppStoreListView) findViewById(R.id.normal_list_grid);
generalListView.setOnItemClickListener(this);
generalListView.setPullLoadEnable(false);
generalListView.setPullRefreshEnable(false);
generalListView.setAppStoreListViewListener(this);
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case HANDLE_UPDATE_APP:
/*List<App> appList = (List<App>) msg.obj;
appListDataSource.clear();
appListDataSource.addAll(appList);*/
if (mAppListAdapter != null) {
mAppListAdapter.notifyDataSetChanged();
}
break;
case GENERAL_APPS_INSTALL_REQUEST:
File file = (File) msg.obj;
// Env.install(getActivity(), file, GENERAL_APPS_INSTALL_REQUEST);
/*Intent intent = new Intent(Intent.ACTION_VIEW);
try {
Runtime.getRuntime().exec("chmod 655 " + file.toString());
} catch (IOException e) {
e.printStackTrace();
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
startActivityForResult(intent, GENERAL_APPS_INSTALL_REQUEST);*/
if (file.exists()) {
Env.install(instance, file, GENERAL_APPS_INSTALL_REQUEST);
}
break;
default:
break;
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setQueryHint(Utils.getResourceString(application, R.string.search_message_hint));
searchView.setOnQueryTextListener(this);
searchView.setSubmitButtonEnabled(true);
searchView.setIconifiedByDefault(true);
return true;
}
public void getAppsBySearchWord() {
ApiService.getAppsByKeyWord(application, AppStorePreference.getTerminalID(application),
keyWord, getAppsCallBack);
}
private CallBack getAppsCallBack = new CallBack() {
@Override
public void onCancelled() {
dismissLoading();
}
@Override
public void onStart() {
showLoading();
}
@Override
public void onSuccess(JSONObject jsonObj) {
try {
String retCode = "";
String data = "";
Logger.d("-------searching app Info=" + jsonObj.toString());
retCode = JsonUtils.getStringValue(jsonObj, Constants.REQUEST_STATUS);
data = JsonUtils.getStringValue(jsonObj, Constants.REQUEST_DATA);
/*if (!Constants.REQUEST_STATUS_OK.equals(retCode)) {
onFailure(data);
} else {
if (TextUtils.isEmpty(data)) {
onFailure(Utils.getResourceString(getActivity(), R.string.nonetwork_prompt_server_error));
} else {
client = JsonUtils.parseJSONClient(jsonObj);
}
}*/
appListDataSource = JsonUtils.parseSearchingJSONApps(jsonObj);
if (appListDataSource != null && appListDataSource.size() > 0) {
Downloader downloader = new Downloader(null, application, null);
DownloadDBOperator mDBOper = DownloadDBOperator.getInstance(application);
mAppListAdapter = new GeneralAppsListAdapter(SearchActivity.this, appListDataSource, application, mHandler, downloader, mDBOper);
generalListView.setAdapter(mAppListAdapter);
mAppListAdapter.notifyDataSetChanged();
}
dismissLoading();
} catch (Exception e) {
e.printStackTrace();
onFailure("searching app response error!");
}
}
@Override
public void onFailure(String msg) {
dismissLoading();
Logger.d("describe=" + msg);
if (msg.contains(ResultSet.NET_ERROR.describe)) {
ToastUtil.showToast(application, R.string.nonetwork_prompt_server_error);
}
}
};
@Override
public boolean onQueryTextSubmit(String query) {
actionBar.setTitle("\"" + query + "\"" + Utils.getResourceString(application, R.string.search_activity_result));
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
Logger.d(query);
this.keyWord = query;
getAppsBySearchWord();
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub
return super.onQueryTextChange(newText);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
mAppListAdapter.notifyDataSetChanged();
}
@Override
public void onRefresh() {
// TODO Auto-generated method stub
}
@Override
public void onLoadMore() {
// TODO Auto-generated method stub
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long arg3) {
Intent mIntent = new Intent(application, SoftwareDetailActivity.class);
Bundle mBundle = new Bundle();
mBundle.putSerializable(Constants.SER_KEY, (Serializable) appListDataSource);
mBundle.putInt(Constants.APP_LIST_POSITION, --position); //ListView header is on first position so to remove one
mIntent.putExtras(mBundle);
startActivity(mIntent);
}
public void refreshUpdateSoftData() {
new CheckUpdateSoftwareThread().start();
}
//check out the installed software and compare the version with the cache in the database
class CheckUpdateSoftwareThread extends Thread {
@Override
public void run() {
Logger.d("invoke scan local apps");
Long start = System.currentTimeMillis();
Map<String, PackageInfo> installedPackage = Env.scanInstalledAppToMap(getApplicationContext());
Long end = System.currentTimeMillis();
Logger.d("total time:" + (end - start));
//cache installed package
application.saveInstalledAppsInfo(installedPackage);
Message msg = mHandler.obtainMessage();
msg.obj = installedPackage;
msg.what = HANDLE_UPDATE_APP;
mHandler.sendMessage(msg);
}
}
}