package com.usai.apex; import java.io.File; import org.json.JSONException; import org.json.JSONObject; import com.usai.util.Network; import com.usai.util.commonUtil; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.app.AlertDialog; import android.app.Dialog; import android.app.DownloadManager; import android.app.AlertDialog.Builder; import android.app.DownloadManager.Request; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.Fragment; import android.text.Html; import android.util.Log; import android.util.SparseIntArray; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.webkit.DownloadListener; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; public class DetailFragment extends Fragment implements OnClickListener /* * , * OnGestureListener */ { private static final int REQUEST_LOGINACTIVITY = 1; // DataFragment mdataFragment; /* private GestureDetector mGestureDetector; */ @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } @Override public void onDestroyView() { Log.d("DetailFragment", "onDestroyView()"); super.onDestroyView(); } // public String get_content() // { // return fragment_content; // } LinearLayout ll_root; ScrollView sl_root; String mimeType = "text/html"; private SearchTask m_task = null; SparseIntArray control = new SparseIntArray(); // private TextView mStatusMessageView; private View mStatusView; String fragment_content = null; public void requestdata() { if (m_task != null) { return; } if (fragment_content != null) { LayoutInflater inflater = (LayoutInflater) ApexTrackingApplication .get_instance().getSystemService( Context.LAYOUT_INFLATER_SERVICE); init(fragment_content, inflater); return; } // if (mdataFragment.get_result() != null) { // LayoutInflater inflater = (LayoutInflater) ApexTrackingApplication // .get_instance().getSystemService( // Context.LAYOUT_INFLATER_SERVICE); // init(mdataFragment.get_result(), inflater); // } // if (fragment_content != null) // return; // mStatusMessageView.setText("Loading"); showProgress(true); m_task = new SearchTask(); m_task.execute(); } public void set_content(String content) { fragment_content = content; } private void showProgress(final boolean show) { // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow // for very easy animations. If available, use these APIs to fade-in // the progress spinner. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { int shortAnimTime = ApexTrackingApplication.get_instance() .getResources() .getInteger(android.R.integer.config_shortAnimTime); mStatusView.setVisibility(View.VISIBLE); mStatusView.animate().setDuration(shortAnimTime) .alpha(show ? 1 : 0) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mStatusView.setVisibility(show ? View.VISIBLE : View.INVISIBLE); } }); ll_root.setVisibility(View.VISIBLE); ll_root.animate().setDuration(shortAnimTime).alpha(show ? 0 : 1) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { ll_root.setVisibility(show ? View.INVISIBLE : View.VISIBLE); } }); } else { // The ViewPropertyAnimator APIs are not available, so simply show // and hide the relevant UI components. mStatusView.setVisibility(show ? View.VISIBLE : View.INVISIBLE); ll_root.setVisibility(show ? View.INVISIBLE : View.VISIBLE); } } // @Override // public void onActivityCreated(Bundle savedInstanceState) // { // FragmentManager fm = getFragmentManager(); // // // Check to see if we have retained the worker fragment. // mdataFragment = (DataFragment)fm.findFragmentByTag("work"); // // // If not retained (or first time running), we need to create it. // if (mdataFragment == null) { // mdataFragment = new DataFragment(); // // Tell it who it is working with. // mdataFragment.setTargetFragment(this, 0); // fm.beginTransaction().add(mdataFragment, "work").commit(); // } // super.onActivityCreated(savedInstanceState); // } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { /* mGestureDetector = new GestureDetector(this); */ View view = inflater.inflate(R.layout.detail_fragment, null); sl_root = (ScrollView) view.findViewById(R.id.sl_root); /* * sl_root.setOnTouchListener(new View.OnTouchListener() { * * @Override public boolean onTouch(View v, MotionEvent event) { return * mGestureDetector.onTouchEvent(event); } }); */ ll_root = (LinearLayout) view.findViewById(R.id.ll_root); mStatusView = view.findViewById(R.id.status); LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_refresh); Button btn_refresh = (Button) ll.findViewById(R.id.btn_refresh); btn_refresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LinearLayout ll = (LinearLayout) ll_root .findViewById(R.id.ll_refresh); ll.setVisibility(View.GONE); requestdata(); } }); // FragmentManager fm = getFragmentManager(); // List fragments = fm.getFragments(); // if (fragments != null) { // Log.e("DetailFragment", "fragments count=" + fragments.size()); // // for (int i = 0; i < fragments.size(); i++) // // Log.e("DetailFragment", "fragments name=" + fragments.size()); // // } // // this.getFragmentManager(); // String tag = getArguments().getString("module_name"); // // Check to see if we have retained the worker fragment. // mdataFragment = (DataFragment) fm.findFragmentById(12345); // // // If not retained (or first time running), we need to create it. // if (mdataFragment == null) { // Log.e("dataFragment creaded ", "tag=data_" + tag); // mdataFragment = new DataFragment(); // // Tell it who it is working with. // mdataFragment.setTargetFragment(this, 0); // fm.beginTransaction().add(12345,mdataFragment, "data+" + // tag).commit(); // } requestdata(); return view; } void init(String jstr, LayoutInflater inflater) { String TAG = "init@DetailFragment"; Log.d(TAG, jstr); try { JSONObject jsonObj = new JSONObject(jstr); int group_count = jsonObj.getInt("count"); if (group_count == 0) { TextView tv_empty = (TextView) ll_root .findViewById(R.id.tv_empty); tv_empty.setVisibility(View.VISIBLE); } for (int i = 0; i < group_count; i++) { // String key = (String) it.next(); // if (key.equals("result")) // continue; JSONObject groupobj = jsonObj.getJSONObject("group" + i); View v = inflater.inflate(R.layout.group_tag, null); v.setOnClickListener(this); TextView tvgroup = (TextView) v.findViewById(R.id.tv_group); String group_name = groupobj.getString("_name"); tvgroup.setText(group_name); v.setId(commonUtil.generateViewId()); ll_root.addView(v); String grouptype = groupobj.getString("_type"); // groupobj.remove("_type"); if (grouptype.equals("mapping")) { LinearLayout mappingview = (LinearLayout) inflater.inflate( R.layout.key_mapping, null); mappingview.setId(commonUtil.generateViewId()); control.put(v.getId(), mappingview.getId()); ll_root.addView(mappingview); int map_count = groupobj.getInt("count"); for (int j = 0; j < map_count; j++) { // String keygroup = (String) itgroup.next(); JSONObject itemobj = groupobj.getJSONObject("item" + j); String key = (String) itemobj.keys().next(); String val = itemobj.getString(key); LinearLayout mappingitem = (LinearLayout) inflater .inflate(R.layout.keymapping_item, null); TextView tvkey = (TextView) mappingitem .findViewById(R.id.tv_key); tvkey.setText(key); // tvkey.setBackgroundResource(R.drawable.detail_item); TextView tvval = (TextView) mappingitem .findViewById(R.id.tv_value); tvval.setText(Html.fromHtml(val)); // tvval.setBackgroundResource(R.drawable.detail_item); mappingview.addView(mappingitem); } // Iterator itgroup = groupobj.keys(); // while (itgroup.hasNext()) // { // // // } } else if (grouptype.equals("table")) { String content = groupobj.getString("content"); WebView wv; wv = (WebView) inflater.inflate(R.layout.web_content, null); wv.getSettings().setDefaultTextEncodingName("UTF-8"); wv.setId(commonUtil.generateViewId()); wv.setWebViewClient(new MyWebViewClient()); wv.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { if(!commonUtil.localdirExist()) { new AlertDialog.Builder(getActivity()) .setIconAttribute(android.R.attr.alertDialogIcon) .setTitle(R.string.str_localdir_error) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked OK so do some stuff */ } }) .create().show(); return; } String filename = contentDisposition.replace("attachment;filename=\"", ""); filename = filename.replace("\"", ""); Log.d("WebView", "Download Action"); Log.i("tag", "url=" + url); // Log.i("tag", "userAgent="+userAgent); // Log.i("tag", // "contentDisposition="+contentDisposition); // Log.i("tag", "mimetype="+mimetype); // Log.i("tag", "contentLength="+contentLength); // Uri uri = Uri.parse(url); // Intent intent = new Intent(Intent.ACTION_VIEW, // uri); // startActivity(intent); final DownloadManager downloadManager = (DownloadManager) ApexTrackingApplication .get_instance().getSystemService( Context.DOWNLOAD_SERVICE); Uri uri = Uri.parse(url); final Request request = new Request(uri); // 设置允许使用的网络类型,这里是移动网络和wifi都可以 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI); request.setDestinationInExternalPublicDir("Apex Mobile",filename); // 禁止发出通知,既后台下载,如果要使用这一句必须声明一个权限:android.permission.DOWNLOAD_WITHOUT_NOTIFICATION // request.setShowRunningNotification(false); // 不显示下载界面 request.setVisibleInDownloadsUi(false); request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); /* * 设置下载后文件存放的位置,如果sdcard不可用,那么设置这个将报错, * 因此最好不设置如果sdcard可用,下载后的文件 在/mnt/sdcard/Android/ * data/packageName/files目录下面 * ,如果sdcard不可用,设置了下面这个将报错,不设置,下载后的文件在/cache这个 目录下面 */ // request.setDestinationInExternalFilesDir(this, // null, "tar.apk"); // getActivity(); AlertDialog.Builder builder = new Builder( getActivity()); builder.setMessage(getString(R.string.str_downloadmessage)); builder.setTitle(getString(R.string.str_confirmdownload)); builder.setPositiveButton( getString(R.string.str_download), new Dialog.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { downloadManager.enqueue(request); dialog.dismiss(); } }); builder.setNegativeButton( getString(R.string.str_cancel), new Dialog.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }); control.put(v.getId(), wv.getId()); wv.loadData(content, mimeType, null); // wv.setOnTouchListener(new OnTouchListener() // { // @Override // public boolean onTouch(View v, MotionEvent event) // { // // if (event.getAction() == MotionEvent.ACTION_UP) // sl_root.requestDisallowInterceptTouchEvent(false); // else // sl_root.requestDisallowInterceptTouchEvent(true); // // return false; // } // }); ll_root.addView(wv); Log.d("table content", content); } if (grouptype.equals("list")) { LinearLayout listview = (LinearLayout) inflater.inflate( R.layout.list_content, null); listview.setId(commonUtil.generateViewId()); control.put(v.getId(), listview.getId()); ll_root.addView(listview); long list_count = groupobj.getInt("count"); for (int j = 0; j < list_count; j++) { RelativeLayout listitem = (RelativeLayout) inflater .inflate(R.layout.list_item, null); TextView tvitem = (TextView) listitem .findViewById(R.id.tv_item); String val = groupobj.getString("line" + j); tvitem.setText(val); // tvitem.setBackgroundResource(R.drawable.detail_item); listitem.removeView(tvitem); listview.addView(tvitem); } // Iterator itgroup = groupobj.keys(); // while (itgroup.hasNext()) // { // String keygroup = (String) itgroup.next(); // // } } // String value = obj.getString(key); // JSONArray array = obj.getJSONArray(key); // for(int i=0;i { int errorcode; @Override protected Boolean doInBackground(Void... params) { Log.d("SearchTask", "doInBackground"); if (!Network.NetworkIsAvailable()) { errorcode = Network.RESULT_NET_NOTAVAILABLE; return false; } String jstr = Network.get_detail(getArguments()); if (jstr == null || jstr.length() <= 0) { // Log.d(TAG, "json is wrong"); errorcode = Network.RESULT_NET_ERROR; return false; } // mdataFragment.put_result(jstr); fragment_content = jstr; DetailActivity activity = (DetailActivity) getActivity(); activity.save_content(getArguments().getString("action_type"), jstr); errorcode = Network.RESULT_TRUE; return true; } @Override protected void onPostExecute(Boolean success) { Log.i("onPostExecute", "entry"); m_task = null; showProgress(false); if (ApexTrackingApplication.get_authorization() == false) { if(((DetailActivity) getActivity()).showlogin == true) return; ((DetailActivity) getActivity()).showlogin = true; LinearLayout ll = (LinearLayout) ll_root .findViewById(R.id.ll_refresh); ll.setVisibility(View.VISIBLE); Toast toast = Toast.makeText( ApexTrackingApplication.get_instance(), getText(R.string.msg_net_passwordchangedremote) , Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); Intent i = new Intent(); i.setClass(getActivity(), ApexActivity.class); startActivityForResult(i, REQUEST_LOGINACTIVITY); return; } switch (errorcode) { case Network.RESULT_NET_NOTAVAILABLE: { Toast toast = Toast.makeText( ApexTrackingApplication.get_instance(), getText(R.string.msg_connection_none), Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); break; } case Network.RESULT_NET_ERROR: { Toast toast = Toast.makeText( ApexTrackingApplication.get_instance(), getText(R.string.msg_net_error), Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); break; } case Network.RESULT_ERROR: // case Network.RESULT_RESPONSE_NULL: { Toast toast = Toast.makeText( ApexTrackingApplication.get_instance(), getText(R.string.msg_net_resulterror) + ":" + errorcode, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); break; } default: break; } if (success) { LayoutInflater inflater = (LayoutInflater) ApexTrackingApplication .get_instance().getSystemService( Context.LAYOUT_INFLATER_SERVICE); init(fragment_content, inflater/* * getActivity(). * getLayoutInflater() */); } else { LinearLayout ll = (LinearLayout) ll_root .findViewById(R.id.ll_refresh); ll.setVisibility(View.VISIBLE); } super.onPostExecute(success); } @Override protected void onCancelled() { m_task = null; showProgress(false); } } // public class DataFragment extends Fragment { // // String result = null; // // @Override // public void onCreate(Bundle savedInstanceState) { // setRetainInstance(true); // super.onCreate(savedInstanceState); // } // // public String get_result() { // return result; // // } // // public void put_result(String s) { // result = s; // } // // } public class MyWebViewClient extends WebViewClient { // 如果页面中链接,如果希望点击链接继续在当前browser中响应, // 而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。 public boolean shouldOverviewUrlLoading(WebView view, String url) { // L.i("shouldOverviewUrlLoading"); view.loadUrl(url); return true; } public void onPageStarted(WebView view, String url, Bitmap favicon) { // L.i("onPageStarted"); // showProgress(); } public void onPageFinished(WebView view, String url) { // L.i("onPageFinished"); // closeProgress(); } public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // L.i("onReceivedError"); // closeProgress(); } } }