/* * Copyright (C) 2012 - 2013 Niall 'Rivernile' Scott * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors or contributors be held liable for * any damages arising from the use of this software. * * The aforementioned copyright holder(s) hereby grant you a * non-transferrable right to use this software for any purpose (including * commercial applications), and to modify it and redistribute it, subject to * the following conditions: * * 1. This notice may not be removed or altered from any file it appears in. * * 2. Any modifications made to this software, except those defined in * clause 3 of this agreement, must be released under this license, and * the source code of any modifications must be made available on a * publically accessible (and locateable) website, or sent to the * original author of this software. * * 3. Software modifications that do not alter the functionality of the * software but are simply adaptations to a specific environment are * exempt from clause 2. */ package uk.org.rivernile.edinburghbustracker.android.fragments.dialogs; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.database.SQLException; import android.os.Build; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.text.DateFormat; import java.util.Calendar; import uk.org.rivernile.edinburghbustracker.android.BusStopDatabase; import uk.org.rivernile.edinburghbustracker.android.R; /** * This Fragment displays the application About Dialog. * * @author Niall Scott */ public class AboutDialogFragment extends DialogFragment { private static final boolean isHoneycombOrGreater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; private static final DateFormat dateFormat = DateFormat.getDateTimeInstance(); private Callbacks callbacks; @Override public void onAttach(final Activity activity) { super.onAttach(activity); try { callbacks = (Callbacks) activity; } catch (ClassCastException e) { throw new IllegalStateException(activity.getClass().getName() + " does not implement " + Callbacks.class.getName()); } } /** * {@inheritDoc} */ @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { final Activity activity = getActivity(); // Get the inflater then inflate the view from XML. final LayoutInflater inflater = LayoutInflater.from(activity); final View layout = inflater.inflate(R.layout.about, null); final TextView temp = (TextView)layout.findViewById(R.id.aboutVersion); // Set the version text. try { temp.setText(getString(R.string.aboutdialog_version, activity.getPackageManager() .getPackageInfo(activity.getPackageName(), 0) .versionName, activity.getPackageManager() .getPackageInfo(activity.getPackageName(), 0).versionCode )); } catch(NameNotFoundException e) { // This should never occur. temp.setText("Unknown"); } final TextView txtDBVersion = (TextView)layout.findViewById(R.id .aboutDBVersion); final TextView txtTopoVersion = (TextView)layout.findViewById( R.id.aboutTopoVersion); // Get the database mod time. long dbtime; final Calendar date = Calendar.getInstance(); final BusStopDatabase bsd = BusStopDatabase.getInstance( activity.getApplicationContext()); try { dbtime = bsd.getLastDBModTime(); } catch(SQLException e) { dbtime = 0; } date.setTimeInMillis(dbtime); // Set the DB version text. txtDBVersion.setText(getString(R.string.aboutdialog_dbversion, dbtime, dateFormat.format(date.getTime()))); // Set the topology ID text. txtTopoVersion.setText(getString(R.string.aboutdialog_topology, bsd.getTopoId())); final Button btnLicenses = (Button)layout .findViewById(R.id.btnLicenses); btnLicenses.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { callbacks.onShowLicences(); } }); // Get the AlertDialog.Builder with the correct theme set. final AlertDialog.Builder builder; if(isHoneycombOrGreater) { builder = getHoneycombDialog(activity); } else { builder = new AlertDialog.Builder(activity); } // Build the Dialog. builder.setView(layout).setNegativeButton(R.string.close, null); return builder.create(); } /** * Attempt to get a THEME_HOLO_DARK dialog when on Honeycomb (Android 3.0) * or greater. * * @param context The Activity context. * @return An AlertDialog.Builder instance to create the Dialog on top of. */ @TargetApi(11) public static AlertDialog.Builder getHoneycombDialog( final Context context) { try { // Get the class. Class cls = AlertDialog.Builder.class; Class[] partypes = new Class[2]; // Set the parameter types. partypes[0] = Context.class; partypes[1] = Integer.TYPE; // Get the constructor. Constructor ct = cls.getConstructor(partypes); // Set the arguments Object[] arglist = new Object[2]; arglist[0] = context; arglist[1] = Integer.valueOf(AlertDialog.THEME_HOLO_DARK); // Call the constructor, returning the new instance. return (AlertDialog.Builder)ct.newInstance(arglist); } catch(NoSuchMethodException e) { } catch(java.lang.InstantiationException e) { } catch(IllegalAccessException e) { } catch(InvocationTargetException e) { } return null; } /** * Any Activities which host this Fragment must implement this interface to * handle navigation events. */ public static interface Callbacks { /** * This is called when the user wants to see the open source licences. */ public void onShowLicences(); } }