summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcretin45 <cretin45@gmail.com>2015-03-04 13:06:26 -0800
committercretin45 <cretin45@gmail.com>2015-03-04 13:08:00 -0800
commitef4cd78d5f5ca98cb2fdaa9e86d564bacb7f5f45 (patch)
treefe4c0d9d9c958856d789f7d6740274d8516ac4d3
parentc9c13f20c9a86ad23381bef95a100189e0d08bca (diff)
downloadpackages_apps_SetupWizard-ef4cd78d5f5ca98cb2fdaa9e86d564bacb7f5f45.tar.gz
packages_apps_SetupWizard-ef4cd78d5f5ca98cb2fdaa9e86d564bacb7f5f45.tar.bz2
packages_apps_SetupWizard-ef4cd78d5f5ca98cb2fdaa9e86d564bacb7f5f45.zip
SetupWizard: Add metrics for internal builds that ship with CMStats
Change-Id: Id932a105c18332e32605530d1502ff99b7cf380a
-rw-r--r--AndroidManifest.xml1
-rw-r--r--src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java160
-rw-r--r--src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java41
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/ChooseDataSimPage.java10
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/CyanogenServicesPage.java20
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/CyanogenSettingsPage.java24
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/DateTimePage.java19
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java31
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/MobileDataPage.java4
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/OtherSettingsPage.java13
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/SetupPage.java7
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/WelcomePage.java8
-rw-r--r--src/com/cyanogenmod/setupwizard/setup/WifiSetupPage.java24
-rw-r--r--src/com/cyanogenmod/setupwizard/ui/SetupPageFragment.java3
-rw-r--r--src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java21
-rw-r--r--src/com/cyanogenmod/setupwizard/util/EnableAccessibilityController.java3
-rw-r--r--src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java6
17 files changed, 377 insertions, 18 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 51490e8..3bed113 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -45,6 +45,7 @@
<uses-permission android:name="android.permission.BACKUP" />
<uses-permission android:name="org.whispersystems.whisperpush.permissions.REGISTER" />
<uses-permission android:name="cyanogenmod.permission.FINISH_SETUP" />
+ <uses-permission android:name="com.cyngn.cmstats.SEND_ANALYTICS" />
<permission
android:name="cyanogenmod.permission.PROTECTED_APP"
diff --git a/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java b/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java
new file mode 100644
index 0000000..cab3660
--- /dev/null
+++ b/src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java
@@ -0,0 +1,160 @@
+/*
+ * 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.Intent;
+import android.os.UserHandle;
+import android.util.Log;
+
+import java.util.LinkedList;
+
+
+public class SetupStats {
+
+ private static final String TAG = SetupStats.class.getSimpleName();
+
+ private static final String ANALYTIC_INTENT = "com.cyngn.cmstats.action.SEND_ANALYTIC_EVENT";
+ private static final String ANALYTIC_PERMISSION = "com.cyngn.cmstats.RECEIVE_ANALYTICS";
+
+ public static final String TRACKING_ID = "tracking_id";
+
+ private final LinkedList<Event> mEvents = new LinkedList<Event>();
+
+ 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<Runnable> mFinishRunnables = new ArrayList<Runnable>();
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()) {