/* Copyright (c) 2009 Matthias Käppler * * 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.github.droidfu.support; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Locale; import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.provider.Settings; import android.provider.Settings.Secure; import android.provider.Settings.SettingNotFoundException; public class DiagnosticSupport { public static final int ANDROID_API_LEVEL; static { int apiLevel = -1; try { apiLevel = Build.VERSION.class.getField("SDK_INT").getInt(null); } catch (Exception e) { apiLevel = Integer.parseInt(Build.VERSION.SDK); } ANDROID_API_LEVEL = apiLevel; } /** * Returns the ANDROID_ID unique device ID for the current device. Reading that ID has changed * between platform versions, so this method takes care of attempting to read it in different * ways, if one failed. * * @param context * the context * @return the device's ANDROID_ID, or null if it could not be determined * @see Secure#ANDROID_ID */ public static String getAndroidId(Context context) { String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); if (androidId == null) { // this happens on 1.6 and older androidId = android.provider.Settings.System.getString(context.getContentResolver(), android.provider.Settings.System.ANDROID_ID); } return androidId; } /** * Same as {@link #getAndroidId(Context)}, but never returns null. * * @param context * the context * @param fallbackValue * the fallback value * @return the device's ANDROID_ID, or the fallback value if it could not be determined * @see Secure#ANDROID_ID */ public static String getAndroidId(Context context, String fallbackValue) { String androidId = getAndroidId(context); if (androidId == null) { androidId = fallbackValue; } return androidId; } public static String getApplicationVersionString(Context context) { try { PackageManager pm = context.getPackageManager(); PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0); return "v" + info.versionName; } catch (Exception e) { e.printStackTrace(); return null; } } public static String createDiagnosis(Activity context, Exception error) { StringBuilder sb = new StringBuilder(); sb.append("Application version: " + getApplicationVersionString(context) + "\n"); sb.append("Device locale: " + Locale.getDefault().toString() + "\n\n"); sb.append("Android ID: " + getAndroidId(context, "n/a")); // phone information sb.append("PHONE SPECS\n"); sb.append("model: " + Build.MODEL + "\n"); sb.append("brand: " + Build.BRAND + "\n"); sb.append("product: " + Build.PRODUCT + "\n"); sb.append("device: " + Build.DEVICE + "\n\n"); // android information sb.append("PLATFORM INFO\n"); sb.append("Android " + Build.VERSION.RELEASE + " " + Build.ID + " (build " + Build.VERSION.INCREMENTAL + ")\n"); sb.append("build tags: " + Build.TAGS + "\n"); sb.append("build type: " + Build.TYPE + "\n\n"); // settings sb.append("SYSTEM SETTINGS\n"); String networkMode = null; ContentResolver resolver = context.getContentResolver(); try { if (Settings.Secure.getInt(resolver, Settings.Secure.WIFI_ON) == 0) { networkMode = "DATA"; } else { networkMode = "WIFI"; } sb.append("network mode: " + networkMode + "\n"); sb.append("HTTP proxy: " + Settings.Secure.getString(resolver, Settings.Secure.HTTP_PROXY) + "\n\n"); } catch (SettingNotFoundException e) { e.printStackTrace(); } sb.append("STACK TRACE FOLLOWS\n\n"); StringWriter stackTrace = new StringWriter(); error.printStackTrace(new PrintWriter(stackTrace)); sb.append(stackTrace.toString()); return sb.toString(); } }