/** * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr) * This file is part of CSipSimple. * * CSipSimple is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * If you own a pjsip commercial license you can also redistribute it * and/or modify it under the terms of the GNU Lesser General Public License * as an android library. * * CSipSimple is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with CSipSimple. If not, see <http://www.gnu.org/licenses/>. */ package com.csipsimple.ui.help; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import com.actionbarsherlock.app.SherlockDialogFragment; import com.csipsimple.R; import com.csipsimple.api.SipConfigManager; import com.csipsimple.api.SipManager; import com.csipsimple.utils.CollectLogs; import com.csipsimple.utils.CustomDistribution; import com.csipsimple.utils.Log; import com.csipsimple.utils.NightlyUpdater; import com.csipsimple.utils.NightlyUpdater.UpdaterPopupLauncher; import com.csipsimple.utils.PreferencesProviderWrapper; import java.util.ArrayList; import java.util.List; public class Help extends SherlockDialogFragment implements OnItemClickListener { private static final String THIS_FILE = "Help"; private PreferencesProviderWrapper prefsWrapper; public static Help newInstance() { Help instance = new Help(); Bundle args = new Bundle(); args.putBoolean(ARG_KILL_LOADING, false); instance.setArguments(args); return instance; } private static final int REQUEST_SEND_LOGS = 0; // Help choices private final static int FAQ = 0, OPEN_ISSUES = 1, SEND_LOGS = 2, START_LOGS = 3, LEGALS = 4, NIGHTLY = 5; private class HelpEntry { public int iconRes; public int textRes; public int choiceTag; public HelpEntry(int icon, int text, int choice) { iconRes = icon; textRes = text; choiceTag = choice; } } @Override public void onAttach(Activity activity) { super.onAttach(activity); prefsWrapper = new PreferencesProviderWrapper(getActivity()); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setIcon(android.R.drawable.ic_menu_help) .setTitle(R.string.help) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dismiss(); } } ) .setView(getCustomView(getActivity().getLayoutInflater(), null, savedInstanceState)) .create(); } public View getCustomView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.help, container, false); ListView lv = (ListView) v.findViewById(android.R.id.list); lv.setOnItemClickListener(this); ArrayList<HelpEntry> items = new ArrayList<HelpEntry>(); // FAQ if(!TextUtils.isEmpty(CustomDistribution.getFaqLink())) { items.add(new HelpEntry(android.R.drawable.ic_menu_info_details, R.string.faq, FAQ)); } // Issue list if(CustomDistribution.showIssueList()) { items.add(new HelpEntry(android.R.drawable.ic_menu_view, R.string.view_existing_issues, OPEN_ISSUES)); } // Log collector if(!TextUtils.isEmpty(CustomDistribution.getSupportEmail()) ) { if(isRecording()) { items.add(new HelpEntry( android.R.drawable.ic_menu_send , R.string.send_logs, SEND_LOGS)); }else { items.add(new HelpEntry( android.R.drawable.ic_menu_save , R.string.record_logs, START_LOGS)); } } items.add(new HelpEntry(android.R.drawable.ic_menu_gallery, R.string.legal_information, LEGALS)); if(NightlyUpdater.isNightlyBuild(getActivity())){ items.add(new HelpEntry(R.drawable.ic_launcher_nightly, R.string.update_nightly_build, NIGHTLY)); } lv.setAdapter(new HelpArrayAdapter(getActivity(), items)); TextView tv = (TextView) v.findViewById(android.R.id.text1); tv.setText(CollectLogs.getApplicationInfo(getActivity())); return v; } private class HelpArrayAdapter extends ArrayAdapter<HelpEntry> { public HelpArrayAdapter(Context ctxt, List<HelpEntry> items) { super(ctxt, R.layout.help_list_row, android.R.id.text1, items); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent); bindView(v, getItem(position)); return v; } /** * Bind the fiew to the help entry content * @param v the view to bind info to * @param he the help entry to display info of */ private void bindView(View v, HelpEntry he) { TextView tv = (TextView) v; tv.setText(he.textRes); tv.setCompoundDrawablesWithIntrinsicBounds(he.iconRes, 0, 0, 0); } } private boolean isRecording() { return (prefsWrapper.getLogLevel() >= 3); } @Override public void onItemClick(AdapterView<?> av, View v, int position, long id) { Log.i(THIS_FILE, "Item clicked : " + id +" " + position); HelpArrayAdapter haa = (HelpArrayAdapter) av.getAdapter(); HelpEntry he = haa.getItem(position); SherlockDialogFragment newFragment; switch (he.choiceTag) { case FAQ: newFragment = Faq.newInstance(); newFragment.show(getFragmentManager(), "faq"); break; case LEGALS: newFragment = Legal.newInstance(); newFragment.show(getFragmentManager(), "issues"); break; case OPEN_ISSUES: Intent it = new Intent(Intent.ACTION_VIEW); it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); it.setData(Uri.parse("http://code.google.com/p/csipsimple/issues")); startActivity(it); break; case NIGHTLY: // We have to check for an update final NightlyUpdater nu = new NightlyUpdater(getActivity()); Thread t = new Thread() { public void run() { UpdaterPopupLauncher ru = nu.getUpdaterPopup(true); if (ru != null) { getActivity().runOnUiThread(ru); } }; }; t.start(); break; case SEND_LOGS: prefsWrapper.setPreferenceStringValue(SipConfigManager.LOG_LEVEL, "1"); try { startActivityForResult(CollectLogs.getLogReportIntent("<<<PLEASE ADD THE BUG DESCRIPTION HERE>>>", getActivity()), REQUEST_SEND_LOGS); }catch(Exception e) { Log.e(THIS_FILE, "Impossible to send logs...", e); } Log.setLogLevel(1); break; case START_LOGS: prefsWrapper.setPreferenceStringValue(SipConfigManager.LOG_LEVEL, "4"); Log.setLogLevel(4); Intent intent = new Intent(SipManager.ACTION_SIP_REQUEST_RESTART); getActivity().sendBroadcast(intent); dismiss(); break; default: break; } } private final static String ARG_KILL_LOADING = "kill_loading"; @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SEND_LOGS) { try { dismiss(); } catch (IllegalStateException ex) { getArguments().putBoolean(ARG_KILL_LOADING, true); } } super.onActivityResult(requestCode, resultCode, data); } @Override public void onResume() { super.onResume(); final boolean kill = getArguments().getBoolean(ARG_KILL_LOADING, false); if (kill) { dismiss(); } } }