SetupWizard: Add metrics for internal builds that ship with CMStats
Change-Id: Id932a105c18332e32605530d1502ff99b7cf380a
This commit is contained in:
parent
c9c13f20c9
commit
ef4cd78d5f
@ -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"
|
||||
|
160
src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java
Normal file
160
src/com/cyanogenmod/setupwizard/cmstats/SetupStats.java
Normal file
@ -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";
|
||||
}
|
||||
|
||||
}
|
41
src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java
Normal file
41
src/com/cyanogenmod/setupwizard/cmstats/StatsUtils.java
Normal file
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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));
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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()
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
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());
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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(
|
||||
|
@ -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()) {
|
||||
|
Loading…
Reference in New Issue
Block a user