From ef4cd78d5f5ca98cb2fdaa9e86d564bacb7f5f45 Mon Sep 17 00:00:00 2001 From: cretin45 Date: Wed, 4 Mar 2015 13:06:26 -0800 Subject: [PATCH] SetupWizard: Add metrics for internal builds that ship with CMStats Change-Id: Id932a105c18332e32605530d1502ff99b7cf380a --- AndroidManifest.xml | 1 + .../setupwizard/cmstats/SetupStats.java | 160 ++++++++++++++++++ .../setupwizard/cmstats/StatsUtils.java | 41 +++++ .../setupwizard/setup/ChooseDataSimPage.java | 10 +- .../setup/CyanogenServicesPage.java | 20 ++- .../setup/CyanogenSettingsPage.java | 24 ++- .../setupwizard/setup/DateTimePage.java | 19 +++ .../setupwizard/setup/GmsAccountPage.java | 31 +++- .../setupwizard/setup/MobileDataPage.java | 4 + .../setupwizard/setup/OtherSettingsPage.java | 13 ++ .../setupwizard/setup/SetupPage.java | 7 + .../setupwizard/setup/WelcomePage.java | 8 + .../setupwizard/setup/WifiSetupPage.java | 24 ++- .../setupwizard/ui/SetupPageFragment.java | 3 + .../setupwizard/ui/SetupWizardActivity.java | 21 ++- .../util/EnableAccessibilityController.java | 3 + .../setupwizard/util/SetupWizardUtils.java | 6 + 17 files changed, 377 insertions(+), 18 deletions(-) create mode 100644 src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java create mode 100644 src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 51490e8..3bed113 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -45,6 +45,7 @@ + mEvents = new LinkedList(); + + private static final SetupStats sInstance = new SetupStats(); + + private static final boolean DEBUG = false; + + private SetupStats() {} + + public static void addEvent(String category, String action, + String label, String value) { + sInstance.mEvents.add(new Event(category, action, label, value)); + } + + public static void addEvent(String category, String action) { + sInstance.mEvents.add(new Event(category, action, null, null)); + } + + public static void sendEvents(Context context) { + while (!sInstance.mEvents.isEmpty()) { + sInstance.sendEvent(context, sInstance.mEvents.remove()); + } + } + + private void sendEvent(Context context, Event event) { + + if (!StatsUtils.isStatsPackageInstalled(context) + || !StatsUtils.isStatsCollectionEnabled(context)) { + return; + } + + // Create new intent + Intent intent = new Intent(); + intent.setAction(ANALYTIC_INTENT); + + // add tracking id + intent.putExtra(TRACKING_ID, context.getPackageName()); + // append + intent.putExtra(Fields.EVENT_CATEGORY, event.category); + if (DEBUG) Log.d(TAG, Fields.EVENT_CATEGORY + "=" + event.category); + intent.putExtra(Fields.EVENT_ACTION, event.action); + if (DEBUG) Log.d(TAG, Fields.EVENT_ACTION + "=" + event.action); + // check if exist + if (event.label != null) { + intent.putExtra(Fields.EVENT_LABEL, event.label); + if (DEBUG) Log.d(TAG, Fields.EVENT_LABEL + "=" + event.label); + } + + if (event.value != null) { + intent.putExtra(Fields.EVENT_VALUE, event.value); + if (DEBUG) Log.d(TAG, Fields.EVENT_VALUE + "=" + event.value); + } + + // broadcast for internal package + context.sendBroadcastAsUser(intent, + new UserHandle(UserHandle.USER_CURRENT), ANALYTIC_PERMISSION); + } + + private static final class Event { + private final String category; + private final String action; + private final String label; + private final String value; + + public Event(String category, String action, String label, String value) { + this.action = action; + this.category = category; + this.label = label; + this.value = value; + } + } + + public static final class Fields { + public static final String EVENT_CATEGORY = "category"; + public static final String EVENT_ACTION = "action"; + public static final String EVENT_LABEL = "label"; + public static final String EVENT_VALUE = "value"; + } + + public static final class Categories { + public static final String APP_LAUNCH = "app_launch"; + public static final String APP_FINISHED = "app_finish"; + public static final String PAGE_LOAD = "page_load"; + public static final String EXTERNAL_PAGE_LOAD = "external_page_load"; + public static final String BUTTON_CLICK = "button_click"; + public static final String SETTING_CHANGED = "setting_changed"; + } + + public static final class Action { + public static final String PAGE_LOADED = "page_loaded"; + public static final String PREVIOUS_BUTTON = "previous_button"; + public static final String NEXT_BUTTON = "next_button"; + public static final String CHANGE_LOCALE = "change_local"; + public static final String EXTERNAL_PAGE_LAUNCH = "external_page_launch"; + public static final String EXTERNAL_PAGE_RESULT = "external_page_result"; + public static final String ENABLE_MOBILE_DATA = "enable_mobile_data"; + public static final String PREFERRED_DATA_SIM = "preferred_data_sim"; + public static final String APPLY_CUSTOM_THEME = "apply_custom_theme"; + public static final String USE_SECURE_SMS = "use_secure_sms"; + public static final String ENABLE_BACKUP = "enable_backup"; + public static final String ENABLE_NAV_KEYS = "enable_nav_keys"; + public static final String ENABLE_LOCATION = "enable_location"; + public static final String ENABLE_NETWORK_LOCATION = "enable_network_location"; + public static final String ENABLE_GPS_LOCATION = "enable_gps_location"; + public static final String DATE_CHANGED = "date_changed"; + public static final String TIME_CHANGED = "time_changed"; + public static final String TIMEZONE_CHANGED = "timezone_changed"; + } + + public static final class Label { + public static final String PAGE = "page"; + public static final String LOCALE = "local"; + public static final String RESULT = "result"; + public static final String WIFI_SETUP = "wifi_setup"; + public static final String CYANOGEN_ACCOUNT = "cyanogen_account_setup"; + public static final String CAPTIVE_PORTAL_LOGIN = "captive_portal_login"; + public static final String EMERGENCY_CALL = "emergency_call"; + public static final String GMS_ACCOUNT = "gms_account"; + public static final String RESTORE = "restore"; + public static final String CHECKED = "checked"; + public static final String VALUE = "value"; + public static final String SLOT = "slot"; + public static final String TOTAL_TIME = "total_time"; + } + +} diff --git a/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java b/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java new file mode 100644 index 0000000..8271e68 --- /dev/null +++ b/src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java @@ -0,0 +1,41 @@ + +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * 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.cyanogenmod.setupwizard.cmstats; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.provider.Settings; + +public class StatsUtils { + private static final String STATS_PACKAGE = "com.cyngn.cmstats"; + + public static boolean isStatsCollectionEnabled(Context context) { + return Settings.Secure.getInt(context.getContentResolver(), + Settings.Secure.STATS_COLLECTION, 1) != 0; + } + + public static boolean isStatsPackageInstalled(Context context) { + try { + PackageInfo pi = context.getPackageManager().getPackageInfo(STATS_PACKAGE, 0); + return pi.applicationInfo.enabled; + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } +} diff --git a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java index a49ebd2..7fc9ee8 100644 --- a/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java @@ -36,6 +36,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.cyanogenmod.setupwizard.R; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.SetupPageFragment; import java.util.List; @@ -179,7 +180,14 @@ public class ChooseDataSimPage extends SetupPage { private void setDataSubChecked(SubInfoRecord subInfoRecord) { if (isDetached()) return; for (int i = 0; i < mCheckBoxes.size(); i++) { - mCheckBoxes.get(i).setChecked(subInfoRecord.slotId == i); + if (subInfoRecord.slotId == i) { + mCheckBoxes.get(i).setChecked(true); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.PREFERRED_DATA_SIM, + SetupStats.Label.SLOT, String.valueOf(i + 1)); + } else { + mCheckBoxes.get(i).setChecked(false); + } } } diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java index 6d9e149..f446967 100644 --- a/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java @@ -31,8 +31,8 @@ import android.os.Bundle; import com.cyanogenmod.setupwizard.R; import com.cyanogenmod.setupwizard.SetupWizardApp; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.LoadingFragment; -import com.cyanogenmod.setupwizard.ui.SetupPageFragment; import com.cyanogenmod.setupwizard.util.SetupWizardUtils; import java.io.IOException; @@ -98,11 +98,19 @@ public class CyanogenServicesPage extends SetupPage { public boolean onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN) { if (resultCode == Activity.RESULT_OK || resultCode == Activity.RESULT_FIRST_USER) { - if (SetupWizardUtils.accountExists(mContext, mContext.getString(R.string.cm_account_type))) { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + SetupStats.Label.CYANOGEN_ACCOUNT, + resultCode == Activity.RESULT_OK ? "success" : "skipped"); + if (SetupWizardUtils.accountExists(mContext, + mContext.getString(R.string.cm_account_type))) { setHidden(true); } getCallbacks().onNextPage(); } else if (resultCode == Activity.RESULT_CANCELED) { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + SetupStats.Label.CYANOGEN_ACCOUNT, "canceled"); getCallbacks().onPreviousPage(); } } @@ -128,11 +136,17 @@ public class CyanogenServicesPage extends SetupPage { android.R.anim.fade_in, android.R.anim.fade_out); if (!mFragment.isDetached()) { + SetupStats + .addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_LAUNCH, + SetupStats.Label.PAGE, + SetupStats.Label.CYANOGEN_ACCOUNT); mFragment.startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_CYANOGEN, options.toBundle()); } else { - if (getCallbacks().isCurrentPage(CyanogenServicesPage.this)) { + if (getCallbacks(). + isCurrentPage(CyanogenServicesPage.this)) { getCallbacks().onNextPage(); } } diff --git a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java index 49b04ee..368ada4 100644 --- a/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java @@ -41,6 +41,7 @@ import android.widget.CheckBox; import android.widget.TextView; import com.cyanogenmod.setupwizard.R; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.SetupPageFragment; import com.cyanogenmod.setupwizard.ui.WebViewDialogFragment; import com.cyanogenmod.setupwizard.util.SetupWizardUtils; @@ -127,6 +128,10 @@ public class CyanogenSettingsPage extends SetupPage { @Override public void run() { if (getData().containsKey(KEY_ENABLE_NAV_KEYS)) { + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.ENABLE_NAV_KEYS, + SetupStats.Label.CHECKED, + String.valueOf(getData().getBoolean(KEY_ENABLE_NAV_KEYS))); writeDisableNavkeysOption(mContext, getData().getBoolean(KEY_ENABLE_NAV_KEYS)); } } @@ -139,8 +144,12 @@ public class CyanogenSettingsPage extends SetupPage { private void handleWhisperPushRegistration() { Bundle privacyData = getData(); if (privacyData != null && - privacyData.containsKey(CyanogenSettingsPage.KEY_REGISTER_WHISPERPUSH) && - privacyData.getBoolean(CyanogenSettingsPage.KEY_REGISTER_WHISPERPUSH)) { + privacyData.containsKey(KEY_REGISTER_WHISPERPUSH) && + privacyData.getBoolean(KEY_REGISTER_WHISPERPUSH)) { + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.USE_SECURE_SMS, + SetupStats.Label.CHECKED, + String.valueOf(privacyData.getBoolean(KEY_REGISTER_WHISPERPUSH))); Log.i(TAG, "Registering with WhisperPush"); WhisperPushUtils.startRegistration(mContext); } @@ -149,9 +158,9 @@ public class CyanogenSettingsPage extends SetupPage { private void handleEnableMetrics() { Bundle privacyData = getData(); if (privacyData != null - && privacyData.containsKey(CyanogenSettingsPage.KEY_SEND_METRICS)) { - Settings.System.putInt(mContext.getContentResolver(), CyanogenSettingsPage.SETTING_METRICS, - privacyData.getBoolean(CyanogenSettingsPage.KEY_SEND_METRICS) ? 1 : 0); + && privacyData.containsKey(KEY_SEND_METRICS)) { + Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.STATS_COLLECTION, + privacyData.getBoolean(KEY_SEND_METRICS) ? 1 : 0); } } @@ -159,9 +168,14 @@ public class CyanogenSettingsPage extends SetupPage { Bundle privacyData = getData(); if (!ThemeUtils.getDefaultThemePackageName(mContext).equals(ThemeConfig.SYSTEM_DEFAULT) && privacyData != null && privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME)) { + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.APPLY_CUSTOM_THEME, + SetupStats.Label.CHECKED, + String.valueOf(privacyData.getBoolean(KEY_APPLY_DEFAULT_THEME))); Log.i(TAG, "Applying default theme"); final ThemeManager tm = (ThemeManager) mContext.getSystemService(Context.THEME_SERVICE); tm.applyDefaultTheme(); + } else { getCallbacks().finishSetup(); } diff --git a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java index 0e04fd9..15cfdca 100644 --- a/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java +++ b/src/com/cyanogenmod/setupwizard/setup/DateTimePage.java @@ -42,6 +42,7 @@ import android.widget.TextView; import android.widget.TimePicker; import com.cyanogenmod.setupwizard.R; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.SetupPageFragment; import org.xmlpull.v1.XmlPullParserException; @@ -135,6 +136,8 @@ public class DateTimePage extends SetupPage { mDateView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, + "date_picker"); showDatePicker(); } }); @@ -142,6 +145,8 @@ public class DateTimePage extends SetupPage { mTimeView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, + "time_picker"); showTimePicker(); } }); @@ -162,11 +167,17 @@ public class DateTimePage extends SetupPage { final Map map = (Map) adapterView.getItemAtPosition(position); final String tzId = (String) map.get(KEY_ID); if (mCurrentTimeZone != null && !mCurrentTimeZone.getID().equals(tzId)) { + SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, + "timezone_picker"); // Update the system timezone value final Activity activity = getActivity(); final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); alarm.setTimeZone(tzId); mCurrentTimeZone = TimeZone.getTimeZone(tzId); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.TIMEZONE_CHANGED, + SetupStats.Label.VALUE, + mCurrentTimeZone.getDisplayName()); } } @@ -209,6 +220,10 @@ public class DateTimePage extends SetupPage { if (activity != null) { setDate(activity, year, month, day); updateTimeAndDateDisplay(activity); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.DATE_CHANGED, + SetupStats.Label.VALUE, + month+"/"+day+"/"+year); } } @@ -218,6 +233,10 @@ public class DateTimePage extends SetupPage { if (activity != null) { setTime(activity, hourOfDay, minute); updateTimeAndDateDisplay(activity); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.TIME_CHANGED, + SetupStats.Label.VALUE, + hourOfDay+":"+minute); } } diff --git a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java index a897db0..a9c50d1 100644 --- a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java @@ -36,6 +36,7 @@ import android.util.Log; import com.cyanogenmod.setupwizard.R; import com.cyanogenmod.setupwizard.SetupWizardApp; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.LoadingFragment; import com.cyanogenmod.setupwizard.util.SetupWizardUtils; @@ -125,12 +126,15 @@ public class GmsAccountPage extends SetupPage { public boolean onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS) { if (!mBackupEnabled && SetupWizardUtils.isOwner() && resultCode == Activity.RESULT_OK) { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + SetupStats.Label.GMS_ACCOUNT, "success"); launchGmsRestorePage(); } else { - handleResult(resultCode); + handleResult(requestCode, resultCode); } } else if (requestCode == SetupWizardApp.REQUEST_CODE_RESTORE_GMS) { - handleResult(resultCode); + handleResult(requestCode, resultCode); setHidden(true); } return true; @@ -147,10 +151,25 @@ public class GmsAccountPage extends SetupPage { } } - private void handleResult(int resultCode) { + private void handleResult(int requestCode, int resultCode) { if (resultCode == Activity.RESULT_CANCELED) { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? + SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "canceled"); getCallbacks().onPreviousPage(); } else { + if (resultCode == Activity.RESULT_OK) { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? + SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "success"); + } else { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + requestCode == SetupWizardApp.REQUEST_CODE_SETUP_GMS ? + SetupStats.Label.GMS_ACCOUNT : SetupStats.Label.RESTORE, "skipped"); + } if (SetupWizardUtils.accountExists(mContext, SetupWizardApp.ACCOUNT_TYPE_GMS)) { setHidden(true); } @@ -174,6 +193,9 @@ public class GmsAccountPage extends SetupPage { ActivityOptions.makeCustomAnimation(mContext, android.R.anim.fade_in, android.R.anim.fade_out); + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_LAUNCH, + SetupStats.Label.PAGE, SetupStats.Label.RESTORE); mFragment.startActivityForResult( intent, SetupWizardApp.REQUEST_CODE_RESTORE_GMS, options.toBundle()); @@ -204,6 +226,9 @@ public class GmsAccountPage extends SetupPage { android.R.anim.fade_in, android.R.anim.fade_out); if (!mFragment.isDetached()) { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_LAUNCH, + SetupStats.Label.PAGE, SetupStats.Label.GMS_ACCOUNT); mFragment.startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_GMS, options.toBundle()); } else { diff --git a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java index d8866bf..de43188 100644 --- a/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java @@ -33,6 +33,7 @@ import android.widget.Switch; import android.widget.TextView; import com.cyanogenmod.setupwizard.R; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.SetupPageFragment; import com.cyanogenmod.setupwizard.util.SetupWizardUtils; @@ -103,6 +104,9 @@ public class MobileDataPage extends SetupPage { boolean checked = !mEnableMobileData.isChecked(); SetupWizardUtils.setMobileDataEnabled(getActivity(), checked); mEnableMobileData.setChecked(checked); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.ENABLE_MOBILE_DATA, + SetupStats.Label.CHECKED, String.valueOf(checked)); } }; diff --git a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java index d6293e9..be0ea62 100644 --- a/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java @@ -38,6 +38,7 @@ import android.widget.TextView; import com.cyanogenmod.setupwizard.R; import com.cyanogenmod.setupwizard.SetupWizardApp; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.SetupPageFragment; import com.cyanogenmod.setupwizard.ui.WebViewDialogFragment; import com.cyanogenmod.setupwizard.util.SetupWizardUtils; @@ -253,6 +254,9 @@ public class OtherSettingsPage extends SetupPage { private void onToggleBackup(boolean checked) { try { mBackupManager.setBackupEnabled(checked); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.ENABLE_BACKUP, + SetupStats.Label.CHECKED, String.valueOf(checked)); } catch (RemoteException e) {} updateBackupToggle(); } @@ -263,11 +267,20 @@ public class OtherSettingsPage extends SetupPage { boolean networkEnabled = Settings.Secure.isLocationProviderEnabled( mContentResolver, LocationManager.NETWORK_PROVIDER); mGps.setChecked(gpsEnabled); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.ENABLE_GPS_LOCATION, + SetupStats.Label.CHECKED, String.valueOf(gpsEnabled)); mNetwork.setChecked(networkEnabled); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.ENABLE_NETWORK_LOCATION, + SetupStats.Label.CHECKED, String.valueOf(networkEnabled)); mLocationAccess.setChecked(gpsEnabled || networkEnabled); } private void onToggleLocationAccess(boolean checked) { + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.ENABLE_LOCATION, + SetupStats.Label.CHECKED, String.valueOf(checked)); Settings.Secure.setLocationProviderEnabled(mContentResolver, LocationManager.GPS_PROVIDER, checked); mGps.setEnabled(checked); diff --git a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java index 476f911..67a238a 100644 --- a/src/com/cyanogenmod/setupwizard/setup/SetupPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/SetupPage.java @@ -26,6 +26,7 @@ import android.transition.Transition; import android.view.Gravity; import com.cyanogenmod.setupwizard.R; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; public abstract class SetupPage implements Page { @@ -75,12 +76,18 @@ public abstract class SetupPage implements Page { public void doLoadAction(FragmentManager fragmentManager, int action) { Fragment fragment = getFragment(fragmentManager, action); if (action == Page.ACTION_NEXT) { + SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, + SetupStats.Action.NEXT_BUTTON, getKey(), + String.valueOf(System.currentTimeMillis())); Transition t = new Slide(Gravity.RIGHT); fragment.setEnterTransition(t); fragmentManager.beginTransaction() .replace(R.id.content,fragment, getKey()) .commit(); } else { + SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, + SetupStats.Action.PREVIOUS_BUTTON, getKey(), + String.valueOf(System.currentTimeMillis())); Transition t = new Slide(Gravity.LEFT); fragment.setEnterTransition(t); fragmentManager.beginTransaction() diff --git a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java index e919267..1f63878 100644 --- a/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java +++ b/src/com/cyanogenmod/setupwizard/setup/WelcomePage.java @@ -30,6 +30,7 @@ import android.widget.ArrayAdapter; import android.widget.NumberPicker; import com.cyanogenmod.setupwizard.R; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.LocalePicker; import com.cyanogenmod.setupwizard.ui.SetupPageFragment; @@ -72,6 +73,10 @@ public class WelcomePage extends SetupPage { ActivityOptions.makeCustomAnimation(mContext, android.R.anim.fade_in, android.R.anim.fade_out); + SetupStats.addEvent(SetupStats.Categories.BUTTON_CLICK, SetupStats.Label.EMERGENCY_CALL); + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_LAUNCH, + SetupStats.Label.PAGE, SetupStats.Label.EMERGENCY_CALL); mContext.startActivity(intent, options.toBundle()); return true; } @@ -158,6 +163,9 @@ public class WelcomePage extends SetupPage { localResources.updateConfiguration(localConfiguration1, null); mHandler.removeCallbacks(mUpdateLocale); mCurrentLocale = paramLocale; + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + SetupStats.Action.CHANGE_LOCALE, SetupStats.Label.LOCALE, + mCurrentLocale.getDisplayName()); mHandler.postDelayed(mUpdateLocale, 1000); } diff --git a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java index 2dc2c94..2559298 100644 --- a/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java @@ -29,6 +29,7 @@ import android.util.Log; import com.cyanogenmod.setupwizard.R; import com.cyanogenmod.setupwizard.SetupWizardApp; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.ui.LoadingFragment; import com.cyanogenmod.setupwizard.ui.SetupPageFragment; import com.cyanogenmod.setupwizard.util.SetupWizardUtils; @@ -75,6 +76,9 @@ public class WifiSetupPage extends SetupPage { ActivityOptions.makeCustomAnimation(mContext, android.R.anim.fade_in, android.R.anim.fade_out); + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_LAUNCH, + SetupStats.Label.PAGE, SetupStats.Label.CAPTIVE_PORTAL_LOGIN); mLoadingFragment.startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL, options.toBundle()); @@ -141,16 +145,31 @@ public class WifiSetupPage extends SetupPage { public boolean onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_WIFI) { if (resultCode == Activity.RESULT_CANCELED) { - getCallbacks().onPreviousPage(); + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + SetupStats.Label.WIFI_SETUP, "canceled"); + getCallbacks().onPreviousPage(); } else if (resultCode == Activity.RESULT_OK) { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + SetupStats.Label.WIFI_SETUP, "success"); checkForCaptivePortal(); } else { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + SetupStats.Label.WIFI_SETUP, "skipped"); getCallbacks().onNextPage(); } } else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) { if (resultCode == Activity.RESULT_CANCELED) { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "canceled"); launchWifiSetup(); } else { + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_RESULT, + SetupStats.Label.CAPTIVE_PORTAL_LOGIN, "success"); getCallbacks().onNextPage(); } } else { @@ -210,6 +229,9 @@ public class WifiSetupPage extends SetupPage { ActivityOptions.makeCustomAnimation(mContext, android.R.anim.fade_in, android.R.anim.fade_out); + SetupStats.addEvent(SetupStats.Categories.EXTERNAL_PAGE_LOAD, + SetupStats.Action.EXTERNAL_PAGE_LAUNCH, + SetupStats.Label.PAGE, SetupStats.Label.WIFI_SETUP); mLoadingFragment.startActivityForResult(intent, SetupWizardApp.REQUEST_CODE_SETUP_WIFI, options.toBundle()); } diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java index 93d6761..6ba0eda 100644 --- a/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java +++ b/src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java @@ -26,6 +26,7 @@ import android.view.ViewGroup; import android.widget.TextView; import com.cyanogenmod.setupwizard.R; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.setup.Page; import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; @@ -47,6 +48,8 @@ public abstract class SetupPageFragment extends Fragment { if (mKey == null) { throw new IllegalArgumentException("No KEY_PAGE_ARGUMENT given"); } + SetupStats.addEvent(SetupStats.Categories.PAGE_LOAD, SetupStats.Action.PAGE_LOADED, + mKey, String.valueOf(System.currentTimeMillis())); } @Override diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java index 3f0d6d6..93c5f31 100644 --- a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java +++ b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java @@ -41,6 +41,7 @@ import android.widget.ProgressBar; import com.cyanogenmod.setupwizard.R; import com.cyanogenmod.setupwizard.SetupWizardApp; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import com.cyanogenmod.setupwizard.setup.CMSetupWizardData; import com.cyanogenmod.setupwizard.setup.Page; import com.cyanogenmod.setupwizard.setup.SetupDataCallbacks; @@ -71,6 +72,8 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks private volatile boolean mIsFinishing = false; + private static long sLaunchTime = 0; + private final ArrayList mFinishRunnables = new ArrayList(); private ThemeManager.ThemeChangeListener mThemeChangeListener = new ThemeManager.ThemeChangeListener() { @@ -90,6 +93,10 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (sLaunchTime == 0) { + SetupStats.addEvent(SetupStats.Categories.APP_LAUNCH, TAG); + sLaunchTime = System.nanoTime(); + } getWindow().setWindowAnimations(android.R.anim.fade_in); setContentView(R.layout.setup_main); mRootView = findViewById(R.id.root); @@ -300,6 +307,9 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks final ThemeManager tm = (ThemeManager) getSystemService(Context.THEME_SERVICE); tm.addClient(mThemeChangeListener); mSetupData.finishPages(); + SetupStats.addEvent(SetupStats.Categories.APP_FINISHED, TAG, + SetupStats.Label.TOTAL_TIME, String.valueOf( + System.nanoTime() - sLaunchTime)); } @Override @@ -322,9 +332,6 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks @Override public void finish() { super.finish(); - for (Runnable runnable : mFinishRunnables) { - runnable.run(); - } overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } @@ -411,11 +418,11 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks if (mEnableAccessibilityController != null) { mEnableAccessibilityController.onDestroy(); } - SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this); - SetupWizardUtils.disableSetupWizard(SetupWizardActivity.this); final ThemeManager tm = (ThemeManager) SetupWizardActivity.this.getSystemService(THEME_SERVICE); tm.removeClient(mThemeChangeListener); + SetupStats.sendEvents(SetupWizardActivity.this); + SetupWizardUtils.disableGMSSetupWizard(SetupWizardActivity.this); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); @@ -425,5 +432,9 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks } }); finish(); + for (Runnable runnable : mFinishRunnables) { + runnable.run(); + } + SetupWizardUtils.disableSetupWizard(SetupWizardActivity.this); } } diff --git a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java index b52d006..8311058 100644 --- a/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java +++ b/src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java @@ -39,6 +39,7 @@ import android.view.accessibility.AccessibilityManager; import android.view.accessibility.IAccessibilityManager; import com.android.internal.R; +import com.cyanogenmod.setupwizard.cmstats.SetupStats; import java.util.ArrayList; import java.util.Iterator; @@ -275,6 +276,8 @@ public class EnableAccessibilityController { // Turn on accessibility mode last. Settings.Secure.putIntForUser(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, 1, userId); + SetupStats.addEvent(SetupStats.Categories.SETTING_CHANGED, + "accessibility_enabled"); } else if (keyguardLocked) { try { mAccessibilityManager.temporaryEnableAccessibilityStateUntilKeyguardRemoved( diff --git a/src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java b/src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java index 981fc55..06aa1fc 100644 --- a/src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java +++ b/src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java @@ -27,6 +27,7 @@ import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; @@ -42,6 +43,11 @@ public class SetupWizardUtils { private SetupWizardUtils(){} + public static boolean isStatsCollectionEnabled(Context context) { + return Settings.Secure.getInt(context.getContentResolver(), + Settings.Secure.STATS_COLLECTION, 1) != 0; + } + public static void tryEnablingWifi(Context context) { WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); if (!wifiManager.isWifiEnabled()) {