/* * (c) 2012 Martin van Zuilekom (http://martin.cubeactive.com) * * 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 com.lechucksoftware.proxy.proxysettings.excluded; import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.text.format.DateFormat; import android.util.Log; import com.lechucksoftware.proxy.proxysettings.R; import com.lechucksoftware.proxy.proxysettings.utils.UIUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * Class to show a change log dialog */ public class ChangeLogDialog { private static final String TAG = ChangeLogDialog.class.getSimpleName(); private final Context mContext; private String mStyle = ""; protected DialogInterface.OnDismissListener mOnDismissListener; public ChangeLogDialog(final Context context) { mContext = context; } protected Context getContext() { return mContext; } //Get the current app version private String getAppVersion() { String versionName = ""; try { final PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0); versionName = packageInfo.versionName; } catch (NameNotFoundException e) { Log.e(TAG, e.getMessage(), e); } return versionName; } //Parse a date string from the xml and format it using the local date format @SuppressLint("SimpleDateFormat") private String parseDate(final String dateString) { final SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); try { final Date parsedDate = dateFormat.parse(dateString); return DateFormat.getDateFormat(getContext()).format(parsedDate); } catch (ParseException ignored) { //If there is a problem parsing the date just return the original string return dateString; } } //Parse a the release tag and appends it to the changelog builder private void parseReleaseTag(final StringBuilder changelogBuilder, final XmlPullParser resourceParser) throws XmlPullParserException, IOException { changelogBuilder.append("<h1>Release: ").append(resourceParser.getAttributeValue(null, "version")).append("</h1>"); //Add date if available if (resourceParser.getAttributeValue(null, "date") != null) { changelogBuilder.append("<span class='date'>").append(parseDate(resourceParser.getAttributeValue(null, "date"))).append("</span>"); } //Add summary if available if (resourceParser.getAttributeValue(null, "summary") != null) { changelogBuilder.append("<span class='summary'>").append(resourceParser.getAttributeValue(null, "summary")).append("</span>"); } changelogBuilder.append("<ul>"); //Parse child nodes int eventType = resourceParser.getEventType(); while ((eventType != XmlPullParser.END_TAG) || (resourceParser.getName().equals("change"))) { if ((eventType == XmlPullParser.START_TAG) && (resourceParser.getName().equals("change"))) { eventType = resourceParser.next(); changelogBuilder.append("<li>"); changelogBuilder.append(resourceParser.getText()); changelogBuilder.append("</li>"); } eventType = resourceParser.next(); } changelogBuilder.append("</ul>"); } //CSS style for the html private String getHead() { return String.format("<head>\n" + " <meta charset=\"utf-8\">\n" + " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n" + " <title>About Proxy Settings</title>\n" + " <meta name=\"description\" content=\"\">\n" + " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n" + " <link rel=\"stylesheet\" href=\"../css/bootstrap.min.css\">\n" + " <link rel=\"stylesheet\" href=\"../css/bootstrap-theme.min.css\">\n" + " <link rel=\"stylesheet\" href=\"../css/main.css\">\n" + " <script src=\"../js/vendor/modernizr-2.6.2-respond-1.1.0.min.js\"></script>\n" + "</head>"); } public void setStyle(final String style) { mStyle = style; } public ChangeLogDialog setOnDismissListener(final DialogInterface.OnDismissListener onDismissListener) { mOnDismissListener = onDismissListener; return this; } //Get the changelog in html code, this will be shown in the dialog's webview private String getHTMLChangelog(final int resourceId, final Resources resources, final int version) { boolean releaseFound = false; final StringBuilder changelogBuilder = new StringBuilder(); changelogBuilder.append("<html>").append(getHead()).append("<body>"); final XmlResourceParser xml = resources.getXml(resourceId); try { int eventType = xml.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if ((eventType == XmlPullParser.START_TAG) && (xml.getName().equals("release"))) { //Check if the version matches the release tag. //When version is 0 every release tag is parsed. final int versioncode = Integer.parseInt(xml.getAttributeValue(null, "versioncode")); if ((version == 0) || (versioncode == version)) { parseReleaseTag(changelogBuilder, xml); releaseFound = true; //At lease one release tag has been parsed. } } eventType = xml.next(); } } catch (XmlPullParserException e) { Log.e(TAG, e.getMessage(), e); return ""; } catch (IOException e) { Log.e(TAG, e.getMessage(), e); return ""; } finally { xml.close(); } changelogBuilder.append("</body></html>"); //Check if there was a release tag parsed, if not return an empty string. if (releaseFound) { return changelogBuilder.toString(); } else { return ""; } } //Returns change log in HTML format public String getHTML() { //TODO: Remove duplicate code with the method show() //Get resources final String packageName = mContext.getPackageName(); final Resources resources; try { resources = mContext.getPackageManager().getResourcesForApplication(packageName); } catch (NameNotFoundException ignored) { return ""; } //Create HTML change log return getHTMLChangelog(R.xml.changelog, resources, 0); } //Call to show the change log dialog public void show() { show(0); } protected void show(final int version) { //Get resources final String packageName = mContext.getPackageName(); final Resources resources; try { resources = mContext.getPackageManager().getResourcesForApplication(packageName); } catch (NameNotFoundException ignored) { return; } //Get dialog title String title = resources.getString(R.string.title_changelog); title = String.format("%s v%s", title, getAppVersion()); //Create html change log final String htmlChangelog = getHTMLChangelog(R.xml.changelog, resources, version); //Get button strings final String closeString = resources.getString(R.string.close); //Check for empty change log if (htmlChangelog.length() == 0) { //It seems like there is nothing to show, just bail out. return; } UIUtils.showHTMLAlertDialog(mContext, title, htmlChangelog, closeString, mOnDismissListener); } }