/******************************************************************************* * Copyright 2013-2016 alladin-IT GmbH * * 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 at.alladin.rmbt.android.about; import java.text.DateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import com.google.android.gms.common.GooglePlayServicesUtil; import android.app.AlertDialog; import android.app.Dialog; import android.content.ClipData; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.text.InputType; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.EditText; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.Toast; import at.alladin.openrmbt.android.R; import at.alladin.rmbt.android.main.AppConstants; import at.alladin.rmbt.android.main.RMBTMainActivity; import at.alladin.rmbt.android.util.ConfigHelper; import at.alladin.rmbt.android.util.RMBTTermsFragment; import at.alladin.rmbt.client.helper.RevisionHelper; /** * * @author * */ public class RMBTAboutFragment extends Fragment { /** * */ private static final String DEBUG_TAG = "RMBTAboutFragment"; /** * */ public static String[] titles; /** * */ public static String[] dialogue; /** * */ private String clientVersion; /** * */ private String clientName; /** * */ private ListAdapter sa; /** * */ private FragmentActivity activity; private int developerFeatureCounter = 0; private Dialog dialog; /** * */ @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.about, container, false); return createView(view, inflater); } private View createView(View view, LayoutInflater inflater) { activity = getActivity(); getAppInfo(activity); final String clientUUID = String.format("U%s", ConfigHelper.getUUID(activity.getApplicationContext())); final String controlServerVersion = ConfigHelper.getControlServerVersion(activity); final ListView listView = (ListView) view.findViewById(R.id.aboutList); final ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); HashMap<String, String> item; item = new HashMap<String, String>(); item.put("title", clientName); item.put("text1", this.getString(R.string.about_rtr_line1)); list.add(item); item = new HashMap<String, String>(); item.put("title", this.getString(R.string.about_version_title)); item.put("text1", clientVersion); item.put("text2", ""); list.add(item); item = new HashMap<String, String>(); item.put("title", getString(R.string.about_clientid_title)); item.put("text1", clientUUID); item.put("text2", ""); list.add(item); item = new HashMap<String, String>(); item.put("title", getString(R.string.about_web_title)); item.put("text1", getString(R.string.about_web_line1)); item.put("text2", ""); list.add(item); item = new HashMap<String, String>(); item.put("title", getString(R.string.about_email_title)); item.put("text1", getString(R.string.about_email_line1)); item.put("text2", ""); list.add(item); item = new HashMap<String, String>(); item.put("title", getString(R.string.about_terms_title)); item.put("text1", getString(R.string.about_terms_line1)); item.put("text2", ""); list.add(item); item = new HashMap<String, String>(); item.put("title", getString(R.string.about_git_title)); item.put("text1", getString(R.string.about_git_line1)); item.put("text2", ""); list.add(item); item = new HashMap<String, String>(); item.put("title", getString(R.string.about_dev_title)); item.put("text1", getString(R.string.about_dev_line1)); item.put("text2", getString(R.string.about_dev_line2)); list.add(item); final String openSourceSoftwareLicenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(getActivity()); if (openSourceSoftwareLicenseInfo != null) { item = new HashMap<String, String>(); item.put("title", getString(R.string.about_gms_legal_title)); item.put("text1", getString(R.string.about_gms_legal_line1)); item.put("text2", ""); list.add(item); } if (ConfigHelper.isDevEnabled(getActivity())) { item = new HashMap<String, String>(); item.put("title", getString(R.string.about_test_counter_title)); item.put("text1", Integer.toString(ConfigHelper.getTestCounter(getActivity()))); item.put("text2", ""); list.add(item); } item = new HashMap<String, String>(); item.put("title", getString(R.string.about_control_server_version)); item.put("text1", controlServerVersion != null ? controlServerVersion : "---"); item.put("text2", ""); list.add(item); sa = new RMBTAboutAdapter(getActivity(), list, R.layout.about_item, new String[] { "title", "text1", "text2" }, new int[] { R.id.title, R.id.text1, R.id.text2 }); listView.setAdapter(sa); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(final AdapterView<?> l, final View v, final int position, final long id) { switch (position) { case 1: handleHiddenCode(); break; case 2: final android.content.ClipboardManager clipBoard = (android.content.ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("client_uuid", clientUUID); clipBoard.setPrimaryClip(clip); final Toast toast = Toast.makeText(getActivity(), R.string.about_clientid_toast, Toast.LENGTH_LONG); toast.show(); break; case 3: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.about_web_link)))); break; case 4: /* Create the Intent */ final Intent emailIntent = new Intent(Intent.ACTION_SEND); /* Fill it with Data */ emailIntent.setType("plain/text"); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { getString(R.string.about_email_email) }); emailIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.about_email_subject)); emailIntent.putExtra(Intent.EXTRA_TEXT, ""); /* Send it off to the Activity-Chooser */ startActivity(Intent.createChooser(emailIntent, getString(R.string.about_email_sending))); break; case 5: final FragmentManager fm = activity.getSupportFragmentManager(); FragmentTransaction ft; ft = fm.beginTransaction(); ft.replace(R.id.fragment_content, new RMBTTermsFragment(), "terms"); ft.addToBackStack("terms"); ft.commit(); break; case 6: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.about_git_link)))); break; case 7: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.about_dev_link)))); break; case 8: final String licenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(getActivity()); AlertDialog.Builder licenseDialog = new AlertDialog.Builder(getActivity()); licenseDialog.setMessage(licenseInfo); licenseDialog.show(); break; default: break; } } }); return view; } private void handleHiddenCode() { if (++developerFeatureCounter >= 10) { developerFeatureCounter = 0; final EditText input = new EditText(getActivity()); input.setInputType(InputType.TYPE_CLASS_NUMBER); final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(input); builder.setTitle(R.string.about_hidden_feature_dialog_title); builder.setMessage(R.string.about_hidden_feature_dialog_enter_code); builder.setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { try { final String data = input.getText().toString(); if (! data.matches("\\d{8}")) { Toast.makeText(getActivity(), R.string.about_hidden_feature_dialog_msg_try_again, Toast.LENGTH_LONG).show(); return; } final int dataInt = Integer.parseInt(data); if (dataInt == 0) // deactivate all features { ConfigHelper.setUserLoopModeState(getActivity(), false); ConfigHelper.setDevModeState(getActivity(), false); ConfigHelper.setServerSelectionState(getActivity(), false); ((RMBTMainActivity) getActivity()).checkSettings(true, null); // refresh server list Toast.makeText(getActivity(), R.string.about_hidden_feature_dialog_msg_deactivated, Toast.LENGTH_LONG).show(); return; } if (ConfigHelper.isValidCheckSum(dataInt)) { // developer mode if (dataInt == AppConstants.DEVELOPER_UNLOCK_CODE) { ConfigHelper.setDevModeState(getActivity(), true); Toast.makeText(getActivity(), R.string.about_dev_mode_activated, Toast.LENGTH_LONG).show(); } else if (dataInt == AppConstants.DEVELOPER_LOCK_CODE) { ConfigHelper.setDevModeState(getActivity(), false); Toast.makeText(getActivity(), R.string.about_dev_mode_deactivated, Toast.LENGTH_LONG).show(); } // loop mode else if (dataInt == AppConstants.LOOP_MODE_UNLOCK_CODE) { ConfigHelper.setUserLoopModeState(getActivity(), true); Toast.makeText(getActivity(), R.string.about_loop_mode_activated, Toast.LENGTH_LONG).show(); } else if (dataInt == AppConstants.LOOP_MODE_LOCK_CODE) { ConfigHelper.setUserLoopModeState(getActivity(), false); Toast.makeText(getActivity(), R.string.about_loop_mode_deactivated, Toast.LENGTH_LONG).show(); } // server selection else if (dataInt == AppConstants.SERVER_SELECTION_UNLOCK_CODE) { ConfigHelper.setServerSelectionState(getActivity(), true); ((RMBTMainActivity) getActivity()).checkSettings(true, null); // refresh server list Toast.makeText(getActivity(), R.string.about_server_selection_activated, Toast.LENGTH_LONG).show(); } else if (dataInt == AppConstants.SERVER_SELECTION_LOCK_CODE) { ConfigHelper.setServerSelectionState(getActivity(), false); ((RMBTMainActivity) getActivity()).checkSettings(true, null); // refresh server list Toast.makeText(getActivity(), R.string.about_server_selection_deactivated, Toast.LENGTH_LONG).show(); } // code not used else { Toast.makeText(getActivity(), R.string.about_hidden_feature_dialog_msg_try_again, Toast.LENGTH_LONG).show(); } } else Toast.makeText(getActivity(), R.string.about_hidden_feature_dialog_msg_try_again, Toast.LENGTH_LONG).show(); } catch (Exception e) // ignore errors { e.printStackTrace(); } } }); builder.setNegativeButton(android.R.string.cancel, null); dialog = builder.create(); dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); dialog.show(); } } /** * * @param context * @return */ private String getAppInfo(final Context context) { PackageInfo pInfo; try { String date = ""; try { final ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0); final ZipFile zf = new ZipFile(ai.sourceDir); final ZipEntry ze = zf.getEntry("classes.dex"); zf.close(); final long time = ze.getTime(); date = DateFormat.getDateTimeInstance().format(new java.util.Date(time)); } catch (final Exception e) {// not much we can do } pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); clientVersion = pInfo.versionName + " (" + pInfo.versionCode + ")\n(" + RevisionHelper.getVerboseRevision() + ")\n(" + date + ")"; clientName = context.getResources().getString(R.string.app_name); } catch (final Exception e) { // e1.printStackTrace(); Log.e(DEBUG_TAG, "version of the application cannot be found", e); } return clientVersion; } @Override public void onDestroy() { super.onDestroy(); if (dialog != null && dialog.isShowing()) dialog.dismiss(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); LayoutInflater inflater = LayoutInflater.from(getActivity()); populateViewForOrientation(inflater, (ViewGroup) getView()); } /** * * @param inflater * @param view */ private void populateViewForOrientation(LayoutInflater inflater, ViewGroup view) { view.removeAllViewsInLayout(); View v = inflater.inflate(R.layout.about, view); createView(v, inflater); } }