diff options
-rwxr-xr-x | AndroidManifest.xml | 33 | ||||
-rwxr-xr-x | res/values/config.xml | 4 | ||||
-rw-r--r-- | res/xml/anonymous_stats.xml | 32 | ||||
-rw-r--r-- | res/xml/preview_data.xml | 53 | ||||
-rw-r--r-- | res/xml/privacy_settings_cyanogenmod.xml | 19 | ||||
-rw-r--r-- | src/com/android/settings/Settings.java | 1 | ||||
-rw-r--r-- | src/com/android/settings/SettingsActivity.java | 4 | ||||
-rw-r--r-- | src/com/android/settings/cmstats/AnonymousStats.java | 107 | ||||
-rw-r--r-- | src/com/android/settings/cmstats/PreviewData.java | 55 | ||||
-rw-r--r-- | src/com/android/settings/cmstats/ReportingService.java | 106 | ||||
-rw-r--r-- | src/com/android/settings/cmstats/ReportingServiceManager.java | 123 | ||||
-rw-r--r-- | src/com/android/settings/cmstats/StatsUploadJobService.java | 291 | ||||
-rw-r--r-- | src/com/android/settings/cmstats/Utilities.java | 102 |
13 files changed, 1 insertions, 929 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ffeb655..ed66593 100755 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1562,12 +1562,6 @@ <activity android:name=".EncryptionInterstitial"/> - <service android:label="ReportingService" - android:enabled="true" - android:exported="false" - android:name=".cmstats.ReportingService"> - </service> - <!-- Runs in the phone process since it needs access to the Phone object --> <activity android:name=".deviceinfo.Status" android:label="@string/device_status_activity_title" @@ -1943,13 +1937,6 @@ <!-- Development settings --> - <!-- DeviceInfo adds the user's requested build to stats upload. --> - <receiver android:name=".DeviceInfo$StatsReportReceiver"> - <intent-filter> - <action android:name="android.intent.action.STATISTICS_REPORT" /> - </intent-filter> - </receiver> - <activity android:name="Display" android:label="@string/display_label" android:configChanges="fontScale" android:taskAffinity="com.android.settings" @@ -2691,26 +2678,6 @@ </intent-filter>$ </receiver> - <!-- Anonymous Statistics --> - <receiver android:name=".cmstats.ReportingServiceManager" - android:enabled="true" - android:exported="false" - android:label="ReportingServiceManager"> - <intent-filter> - <action android:name="android.intent.action.BOOT_COMPLETED" /> - <action android:name="com.android.settings.action.TRIGGER_REPORT_METRICS" /> - </intent-filter> - </receiver> - - <service android:label="ReportingService" - android:enabled="true" - android:exported="false" - android:name=".cmstats.ReportingService"> - </service> - - <service android:name=".cmstats.StatsUploadJobService" - android:permission="android.permission.BIND_JOB_SERVICE" /> - <!-- Watch for ContactsContract.Profile changes and update the user's photo. --> <receiver android:name=".users.ProfileUpdateReceiver"> <intent-filter> diff --git a/res/values/config.xml b/res/values/config.xml index aa97d3c..1761232 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -50,10 +50,6 @@ <!-- Config to enable duplicate APN checking. When true, disallows adding new duplicate APNs --> <bool name="config_enable_duplicate_apn_checking">false</bool> - <!-- Metrics server endpoints --> - <string name="stats_cm_url">https://stats.cyanogenmod.org/submit</string> - <string name="stats_cyanogen_url">https://shopvac.cyngn.com/community/heartbeat</string> - <string name="stats_cyanogen_token_url">https://account.cyngn.com/api/v1/community/heartbeat_token</string> <!-- Display ro.product.name above Device model --> <bool name="config_displayDeviceName">false</bool> diff --git a/res/xml/anonymous_stats.xml b/res/xml/anonymous_stats.xml deleted file mode 100644 index 0f3b8e2..0000000 --- a/res/xml/anonymous_stats.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 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. ---> - -<PreferenceScreen - xmlns:android="http://schemas.android.com/apk/res/android" - android:title="@string/anonymous_statistics_title" - xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"> - - <com.android.settings.cyanogenmod.CMSecureSettingSwitchPreference - android:key="stats_collection" - android:title="@string/stats_collection_title" - android:summary="@string/stats_collection_summary" - android:defaultValue="true" /> - - <PreferenceScreen - android:title="@string/preview_data_title" - android:fragment="com.android.settings.cmstats.PreviewData" /> - -</PreferenceScreen> diff --git a/res/xml/preview_data.xml b/res/xml/preview_data.xml deleted file mode 100644 index 966e501..0000000 --- a/res/xml/preview_data.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 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. ---> - -<PreferenceScreen - xmlns:android="http://schemas.android.com/apk/res/android" - android:title="@string/preview_data_title" - xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"> - - <Preference - android:key="preview_id" - style="?android:preferenceInformationStyle" - android:title="@string/preview_id_title" - android:summary="%s" /> - - <Preference - android:key="preview_device" - style="?android:preferenceInformationStyle" - android:title="@string/preview_device_title" - android:summary="%s" /> - - <Preference - android:key="preview_version" - style="?android:preferenceInformationStyle" - android:title="@string/preview_version_title" - android:summary="%s" /> - - <Preference - android:key="preview_country" - style="?android:preferenceInformationStyle" - android:title="@string/preview_country_title" - android:summary="%s" /> - - <Preference - android:key="preview_carrier" - style="?android:preferenceInformationStyle" - android:title="@string/preview_carrier_title" - android:summary="%s" /> - -</PreferenceScreen> - diff --git a/res/xml/privacy_settings_cyanogenmod.xml b/res/xml/privacy_settings_cyanogenmod.xml index 1ce0f12..cf84b02 100644 --- a/res/xml/privacy_settings_cyanogenmod.xml +++ b/res/xml/privacy_settings_cyanogenmod.xml @@ -28,23 +28,4 @@ android:title="@string/blacklist_title" android:summary="@string/blacklist_summary" android:fragment="com.android.settings.blacklist.BlacklistSettings" /> - - <!-- Anonymous statistics - (CMStats) --> - <PreferenceScreen - android:key="cmstats" - android:title="@string/anonymous_statistics_title" - android:summary="@string/anonymous_statistics_summary" - android:fragment="com.android.settings.cmstats.AnonymousStats" > - </PreferenceScreen> - - <!-- Protected Apps! --> - <Preference - android:key="protected_apps_manager" - android:title="@string/protected_apps" - android:summary="@string/protected_apps_summary"> - <intent - android:action="android.intent.action.VIEW" - android:targetPackage="com.android.settings" - android:targetClass="com.android.settings.applications.ProtectedAppsActivity" /> - </Preference> </PreferenceScreen> diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 0834b4f..a52af29 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -122,7 +122,6 @@ public class Settings extends SettingsActivity { public static class DisplayRotationActivity extends SettingsActivity { /* empty */ } public static class BlacklistSettingsActivity extends SettingsActivity { /* empty */ } public static class ProfilesSettingsActivity extends SettingsActivity { /* empty */ } - public static class AnonymousStatsActivity extends Settings { /* empty */ } public static class ContributorsCloudActivity extends SettingsActivity { /* empty */ } public static class CMSoundSettingsActivity extends SettingsActivity { /* empty */ } public static class LockScreenSettingsActivity extends SettingsActivity { /* empty */ } diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index b54d771..d5c53a4 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -1250,9 +1250,7 @@ public class SettingsActivity extends Activity } private void updateTilesList(List<DashboardCategory> target) { - final boolean showDev = mDevelopmentPreferences.getBoolean( - DevelopmentSettings.PREF_SHOW, - android.os.Build.TYPE.equals("eng")); + final boolean showDev = true; final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE); diff --git a/src/com/android/settings/cmstats/AnonymousStats.java b/src/com/android/settings/cmstats/AnonymousStats.java deleted file mode 100644 index 232a533..0000000 --- a/src/com/android/settings/cmstats/AnonymousStats.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2015 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.android.settings.cmstats; - -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; - -import android.os.UserHandle; -import android.preference.Preference; -import android.preference.PreferenceScreen; -import android.preference.SwitchPreference; -import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; - -import cyanogenmod.providers.CMSettings; - -import org.cyanogenmod.internal.logging.CMMetricsLogger; - -public class AnonymousStats extends SettingsPreferenceFragment { - - private static final String PREF_FILE_NAME = "CMStats"; - /* package */ static final String ANONYMOUS_OPT_IN = "pref_anonymous_opt_in"; - /* package */ static final String ANONYMOUS_LAST_CHECKED = "pref_anonymous_checked_in"; - - /* package */ static final String KEY_LAST_JOB_ID = "last_job_id"; - /* package */ static final int QUEUE_MAX_THRESHOLD = 1000; - - public static final String KEY_STATS = "stats_collection"; - - SwitchPreference mStatsSwitch; - - public static SharedPreferences getPreferences(Context context) { - return context.getSharedPreferences(PREF_FILE_NAME, 0); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.anonymous_stats); - mStatsSwitch = (SwitchPreference) findPreference(KEY_STATS); - } - - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - if (preference == mStatsSwitch) { - boolean checked = mStatsSwitch.isChecked(); - if (checked) { - // clear opt out flags - CMSettings.Secure.putIntForUser(getContentResolver(), - CMSettings.Secure.STATS_COLLECTION_REPORTED, 0, UserHandle.USER_OWNER); - } - // will initiate opt out sequence if necessary - ReportingServiceManager.setAlarm(getActivity()); - return true; - } - return super.onPreferenceTreeClick(preferenceScreen, preference); - } - - public static void updateLastSynced(Context context) { - getPreferences(context) - .edit() - .putLong(ANONYMOUS_LAST_CHECKED,System.currentTimeMillis()) - .commit(); - } - - private static int getLastJobId(Context context) { - return getPreferences(context).getInt(KEY_LAST_JOB_ID, 0); - } - - private static void setLastJobId(Context context, int id) { - getPreferences(context) - .edit() - .putInt(KEY_LAST_JOB_ID, id) - .commit(); - } - - public static int getNextJobId(Context context) { - int lastId = getLastJobId(context); - if (lastId >= QUEUE_MAX_THRESHOLD) { - lastId = 1; - } else { - lastId += 1; - } - setLastJobId(context, lastId); - return lastId; - } - - @Override - protected int getMetricsCategory() { - return CMMetricsLogger.ANONYMOUS_STATS; - } -} diff --git a/src/com/android/settings/cmstats/PreviewData.java b/src/com/android/settings/cmstats/PreviewData.java deleted file mode 100644 index 0adacad..0000000 --- a/src/com/android/settings/cmstats/PreviewData.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2012 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.android.settings.cmstats; - -import android.content.Context; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceScreen; - -import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; -import org.cyanogenmod.internal.logging.CMMetricsLogger; - -public class PreviewData extends SettingsPreferenceFragment { - private static final String UNIQUE_ID = "preview_id"; - private static final String DEVICE = "preview_device"; - private static final String VERSION = "preview_version"; - private static final String COUNTRY = "preview_country"; - private static final String CARRIER = "preview_carrier"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - addPreferencesFromResource(R.xml.preview_data); - - final PreferenceScreen prefSet = getPreferenceScreen(); - final Context context = getActivity(); - - prefSet.findPreference(UNIQUE_ID).setSummary(Utilities.getUniqueID(context)); - prefSet.findPreference(DEVICE).setSummary(Utilities.getDevice()); - prefSet.findPreference(VERSION).setSummary(Utilities.getModVersion()); - prefSet.findPreference(COUNTRY).setSummary(Utilities.getCountryCode(context)); - prefSet.findPreference(CARRIER).setSummary(Utilities.getCarrier(context)); - } - - @Override - protected int getMetricsCategory() { - return CMMetricsLogger.PREVIEW_DATA; - } -} diff --git a/src/com/android/settings/cmstats/ReportingService.java b/src/com/android/settings/cmstats/ReportingService.java deleted file mode 100644 index 8410143..0000000 --- a/src/com/android/settings/cmstats/ReportingService.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2015 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.android.settings.cmstats; - -import android.app.IntentService; -import android.app.job.JobInfo; -import android.app.job.JobScheduler; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.os.PersistableBundle; -import android.os.UserHandle; -import android.util.Log; -import cyanogenmod.providers.CMSettings; - -import java.util.List; - -public class ReportingService extends IntentService { - /* package */ static final String TAG = "CMStats"; - private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - - public static final String EXTRA_OPTING_OUT = "cmstats::opt_out"; - - public ReportingService() { - super(ReportingService.class.getSimpleName()); - } - - @Override - protected void onHandleIntent(Intent intent) { - JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); - - String deviceId = Utilities.getUniqueID(getApplicationContext()); - String deviceName = Utilities.getDevice(); - String deviceVersion = Utilities.getModVersion(); - String deviceCountry = Utilities.getCountryCode(getApplicationContext()); - String deviceCarrier = Utilities.getCarrier(getApplicationContext()); - String deviceCarrierId = Utilities.getCarrierId(getApplicationContext()); - boolean optOut = intent.getBooleanExtra(EXTRA_OPTING_OUT, false); - - final int cyanogenJobId = AnonymousStats.getNextJobId(getApplicationContext()); - final int cmOrgJobId = AnonymousStats.getNextJobId(getApplicationContext()); - - if (DEBUG) Log.d(TAG, "scheduling jobs id: " + cyanogenJobId + ", " + cmOrgJobId); - - PersistableBundle cyanogenBundle = new PersistableBundle(); - cyanogenBundle.putBoolean(StatsUploadJobService.KEY_OPT_OUT, optOut); - cyanogenBundle.putString(StatsUploadJobService.KEY_DEVICE_NAME, deviceName); - cyanogenBundle.putString(StatsUploadJobService.KEY_UNIQUE_ID, deviceId); - cyanogenBundle.putString(StatsUploadJobService.KEY_VERSION, deviceVersion); - cyanogenBundle.putString(StatsUploadJobService.KEY_COUNTRY, deviceCountry); - cyanogenBundle.putString(StatsUploadJobService.KEY_CARRIER, deviceCarrier); - cyanogenBundle.putString(StatsUploadJobService.KEY_CARRIER_ID, deviceCarrierId); - cyanogenBundle.putLong(StatsUploadJobService.KEY_TIMESTAMP, System.currentTimeMillis()); - - // get snapshot and persist it - PersistableBundle cmBundle = new PersistableBundle(cyanogenBundle); - - // set job types - cyanogenBundle.putInt(StatsUploadJobService.KEY_JOB_TYPE, - StatsUploadJobService.JOB_TYPE_CYANOGEN); - cmBundle.putInt(StatsUploadJobService.KEY_JOB_TYPE, - StatsUploadJobService.JOB_TYPE_CMORG); - - // schedule cyanogen stats upload - js.schedule(new JobInfo.Builder(cyanogenJobId, new ComponentName(getPackageName(), - StatsUploadJobService.class.getName())) - .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) - .setMinimumLatency(1000) - .setExtras(cyanogenBundle) - .setPersisted(true) - .build()); - - // schedule cmorg stats upload - js.schedule(new JobInfo.Builder(cmOrgJobId, new ComponentName(getPackageName(), - StatsUploadJobService.class.getName())) - .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) - .setMinimumLatency(1000) - .setExtras(cmBundle) - .setPersisted(true) - .build()); - - if (optOut) { - // we've successfully scheduled the opt out. - CMSettings.Secure.putIntForUser(getContentResolver(), - CMSettings.Secure.STATS_COLLECTION_REPORTED, 1, UserHandle.USER_OWNER); - } - - // reschedule - AnonymousStats.updateLastSynced(this); - ReportingServiceManager.setAlarm(this); - } -} diff --git a/src/com/android/settings/cmstats/ReportingServiceManager.java b/src/com/android/settings/cmstats/ReportingServiceManager.java deleted file mode 100644 index bce1372..0000000 --- a/src/com/android/settings/cmstats/ReportingServiceManager.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2012 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.android.settings.cmstats; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.app.job.JobScheduler; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.UserHandle; -import android.util.Log; -import cyanogenmod.providers.CMSettings; - -public class ReportingServiceManager extends BroadcastReceiver { - private static final long MILLIS_PER_HOUR = 60L * 60L * 1000L; - private static final long MILLIS_PER_DAY = 24L * MILLIS_PER_HOUR; - private static final long UPDATE_INTERVAL = 1L * MILLIS_PER_DAY; - - private static final String TAG = ReportingServiceManager.class.getSimpleName(); - - public static final String ACTION_LAUNCH_SERVICE = - "com.android.settings.action.TRIGGER_REPORT_METRICS"; - public static final String EXTRA_FORCE = "force"; - - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { - setAlarm(context); - } else if (intent.getAction().equals(ACTION_LAUNCH_SERVICE)){ - launchService(context, intent.getBooleanExtra(EXTRA_FORCE, false)); - } - } - - /** - * opt out if we haven't yet - */ - public static void initiateOptOut(Context context) { - final boolean optOutReported = CMSettings.Secure.getIntForUser(context.getContentResolver(), - CMSettings.Secure.STATS_COLLECTION_REPORTED, 0, UserHandle.USER_OWNER) == 1; - if (!optOutReported) { - Intent intent = new Intent(); - intent.setClass(context, ReportingService.class); - intent.putExtra(ReportingService.EXTRA_OPTING_OUT, true); - context.startServiceAsUser(intent, UserHandle.OWNER); - } - } - - public static void setAlarm(Context context) { - SharedPreferences prefs = AnonymousStats.getPreferences(context); - if (prefs.contains(AnonymousStats.ANONYMOUS_OPT_IN)) { - migrate(context, prefs); - } - if (!Utilities.isStatsCollectionEnabled(context)) { - initiateOptOut(context); - return; - } - long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); - if (lastSynced == 0) { - launchService(context, true); // service will reschedule the next alarm - return; - } - long millisFromNow = (lastSynced + UPDATE_INTERVAL) - System.currentTimeMillis(); - - Intent intent = new Intent(ACTION_LAUNCH_SERVICE); - intent.setClass(context, ReportingServiceManager.class); - - AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisFromNow, - PendingIntent.getBroadcast(context, 0, intent, 0)); - Log.d(TAG, "Next sync attempt in : " - + (millisFromNow / MILLIS_PER_HOUR) + " hours"); - } - - public static void launchService(Context context, boolean force) { - SharedPreferences prefs = AnonymousStats.getPreferences(context); - - if (!Utilities.isStatsCollectionEnabled(context)) { - return; - } - - if (!force) { - long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); - if (lastSynced == 0) { - setAlarm(context); - return; - } - long timeElapsed = System.currentTimeMillis() - lastSynced; - if (timeElapsed < UPDATE_INTERVAL) { - long timeLeft = UPDATE_INTERVAL - timeElapsed; - Log.d(TAG, "Waiting for next sync : " - + timeLeft / MILLIS_PER_HOUR + " hours"); - return; - } - } - - Intent intent = new Intent(); - intent.setClass(context, ReportingService.class); - context.startServiceAsUser(intent, UserHandle.OWNER); - } - - private static void migrate(Context context, SharedPreferences prefs) { - Utilities.setStatsCollectionEnabled(context, - prefs.getBoolean(AnonymousStats.ANONYMOUS_OPT_IN, true)); - prefs.edit().remove(AnonymousStats.ANONYMOUS_OPT_IN).commit(); - } - -} diff --git a/src/com/android/settings/cmstats/StatsUploadJobService.java b/src/com/android/settings/cmstats/StatsUploadJobService.java deleted file mode 100644 index 580a20f..0000000 --- a/src/com/android/settings/cmstats/StatsUploadJobService.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (C) 2015 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.android.settings.cmstats; - -import android.app.job.JobParameters; -import android.app.job.JobService; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.PersistableBundle; -import android.util.ArrayMap; -import android.util.Log; -import com.android.settings.R; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.Collections; -import java.util.Map; - -public class StatsUploadJobService extends JobService { - - private static final String TAG = StatsUploadJobService.class.getSimpleName(); - private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - - public static final String KEY_JOB_TYPE = "job_type"; - public static final int JOB_TYPE_CYANOGEN = 1; - public static final int JOB_TYPE_CMORG = 2; - - public static final String KEY_UNIQUE_ID = "uniqueId"; - public static final String KEY_DEVICE_NAME = "deviceName"; - public static final String KEY_VERSION = "version"; - public static final String KEY_COUNTRY = "country"; - public static final String KEY_CARRIER = "carrier"; - public static final String KEY_CARRIER_ID = "carrierId"; - public static final String KEY_TIMESTAMP = "timeStamp"; - public static final String KEY_OPT_OUT = "optOut"; - - private final Map<JobParameters, StatsUploadTask> mCurrentJobs - = Collections.synchronizedMap(new ArrayMap<JobParameters, StatsUploadTask>()); - - @Override - public boolean onStartJob(JobParameters jobParameters) { - if (DEBUG) - Log.d(TAG, "onStartJob() called with " + "jobParameters = [" + jobParameters + "]"); - final StatsUploadTask uploadTask = new StatsUploadTask(jobParameters); - mCurrentJobs.put(jobParameters, uploadTask); - uploadTask.execute((Void) null); - return true; - } - - @Override - public boolean onStopJob(JobParameters jobParameters) { - if (DEBUG) - Log.d(TAG, "onStopJob() called with " + "jobParameters = [" + jobParameters + "]"); - - final StatsUploadTask cancelledJob; - cancelledJob = mCurrentJobs.remove(jobParameters); - - if (cancelledJob != null) { - // cancel the ongoing background task - cancelledJob.cancel(true); - return true; // reschedule - } - - return false; - } - - private class StatsUploadTask extends AsyncTask<Void, Void, Boolean> { - - private JobParameters mJobParams; - - public StatsUploadTask(JobParameters jobParams) { - this.mJobParams = jobParams; - } - - @Override - protected Boolean doInBackground(Void... params) { - - PersistableBundle extras = mJobParams.getExtras(); - - String deviceId = extras.getString(KEY_UNIQUE_ID); - String deviceName = extras.getString(KEY_DEVICE_NAME); - String deviceVersion = extras.getString(KEY_VERSION); - String deviceCountry = extras.getString(KEY_COUNTRY); - String deviceCarrier = extras.getString(KEY_CARRIER); - String deviceCarrierId = extras.getString(KEY_CARRIER_ID); - long timeStamp = extras.getLong(KEY_TIMESTAMP); - boolean optOut = extras.getBoolean(KEY_OPT_OUT); - - boolean success = false; - int jobType = extras.getInt(KEY_JOB_TYPE, -1); - if (!isCancelled()) { - switch (jobType) { - case JOB_TYPE_CYANOGEN: - try { - JSONObject json = new JSONObject(); - json.put("optOut", optOut); - json.put("uniqueId", deviceId); - json.put("deviceName", deviceName); - json.put("version", deviceVersion); - json.put("country", deviceCountry); - json.put("carrier", deviceCarrier); - json.put("carrierId", deviceCarrierId); - json.put("timestamp", timeStamp); - - success = uploadToCyanogen(json); - } catch (IOException | JSONException e) { - Log.e(TAG, "Could not upload stats checkin to cyanogen server", e); - success = false; - } - break; - - case JOB_TYPE_CMORG: - try { - success = uploadToCM(deviceId, deviceName, deviceVersion, deviceCountry, - deviceCarrier, deviceCarrierId, optOut); - } catch (IOException e) { - Log.e(TAG, "Could not upload stats checkin to commnity server", e); - success = false; - } - break; - } - } - if (DEBUG) - Log.d(TAG, "job id " + mJobParams.getJobId() + ", has finished with success=" - + success); - return success; - } - - @Override - protected void onPostExecute(Boolean success) { - mCurrentJobs.remove(mJobParams); - jobFinished(mJobParams, !success); - } - } - - - private boolean uploadToCM(String deviceId, String deviceName, String deviceVersion, - String deviceCountry, String deviceCarrier, String deviceCarrierId, - boolean optOut) - throws IOException { - - final Uri uri = Uri.parse(getString(R.string.stats_cm_url)).buildUpon() - .appendQueryParameter("opt_out", optOut ? "1" : "0") - .appendQueryParameter("device_hash", deviceId) - .appendQueryParameter("device_name", deviceName) - .appendQueryParameter("device_version", deviceVersion) - .appendQueryParameter("device_country", deviceCountry) - .appendQueryParameter("device_carrier", deviceCarrier) - .appendQueryParameter("device_carrier_id", deviceCarrierId).build(); - URL url = new URL(uri.toString()); - HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); - try { - urlConnection.setInstanceFollowRedirects(true); - urlConnection.setDoOutput(true); - urlConnection.connect(); - - final int responseCode = urlConnection.getResponseCode(); - if (DEBUG) Log.d(TAG, "cm server response code=" + responseCode); - final boolean success = responseCode == HttpURLConnection.HTTP_OK; - if (!success) { - Log.w(TAG, "failed sending, server returned: " + getResponse(urlConnection, - !success)); - } - return success; - } finally { - urlConnection.disconnect(); - } - - } - - private boolean uploadToCyanogen(JSONObject json) - throws IOException, JSONException { - String authToken = getAuthToken(); - - if (authToken.isEmpty()) { - Log.w(TAG, "no auth token!"); - } - - URL url = new URL(getString(R.string.stats_cyanogen_url)); - HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); - try { - urlConnection.setInstanceFollowRedirects(true); - urlConnection.setDoInput(true); - urlConnection.setDoOutput(true); - - urlConnection.setRequestProperty("Accept-Encoding", "identity"); - urlConnection.setRequestProperty("Authorization", authToken); - urlConnection.setRequestProperty("Content-Type", "application/json"); - - OutputStream os = urlConnection.getOutputStream(); - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); - writer.write(json.toString()); - writer.flush(); - writer.close(); - os.close(); - - urlConnection.connect(); - - final int responseCode = urlConnection.getResponseCode(); - final boolean success = responseCode == HttpURLConnection.HTTP_OK; - - final String response = getResponse(urlConnection, !success); - if (DEBUG) - Log.d(TAG, "server responseCode: " + responseCode +", response=" + response); - - if (!success) { - Log.w(TAG, "failed sending, server returned: " + response); - } - return success; - } finally { - urlConnection.disconnect(); - } - } - - private String getAuthToken() { - HttpURLConnection urlConnection = null; - try { - URL url = new URL(getString(R.string.stats_cyanogen_token_url)); - urlConnection = (HttpURLConnection) url.openConnection(); - urlConnection.setInstanceFollowRedirects(true); - urlConnection.setDoInput(true); - - urlConnection.setRequestProperty("Accept-Encoding", "identity"); - urlConnection.setRequestProperty("Content-Type", "text/plain"); - - urlConnection.connect(); - - final int responseCode = urlConnection.getResponseCode(); - final boolean success = responseCode == HttpURLConnection.HTTP_OK; - if (DEBUG) Log.d(TAG, "server auth response code=" + responseCode); - final String response = getResponse(urlConnection, !success); - if (DEBUG) - Log.d(TAG, "server auth response=" + response); - - if (success) { - return response; - } - } catch (IOException e) { - Log.e(TAG, "error getting auth token", e); - } finally { - if (urlConnection != null) { - urlConnection.disconnect(); - } - } - return ""; - } - - private String getResponse(HttpURLConnection httpUrlConnection, boolean errorStream) - throws IOException { - InputStream responseStream = new BufferedInputStream(errorStream - ? httpUrlConnection.getErrorStream() - : httpUrlConnection.getInputStream()); - - BufferedReader responseStreamReader = new BufferedReader( - new InputStreamReader(responseStream)); - String line = ""; - StringBuilder stringBuilder = new StringBuilder(); - while ((line = responseStreamReader.readLine()) != null) { - stringBuilder.append(line).append("\n"); - } - responseStreamReader.close(); - responseStream.close(); - - return stringBuilder.toString(); - } - -} diff --git a/src/com/android/settings/cmstats/Utilities.java b/src/com/android/settings/cmstats/Utilities.java deleted file mode 100644 index 1e98888..0000000 --- a/src/com/android/settings/cmstats/Utilities.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2012 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.android.settings.cmstats; - -import android.content.Context; -import android.os.Build; -import android.os.SystemProperties; -import android.provider.Settings; -import android.telephony.TelephonyManager; -import android.text.TextUtils; - -import cyanogenmod.providers.CMSettings; - -import java.math.BigInteger; -import java.net.NetworkInterface; -import java.security.MessageDigest; - -public class Utilities { - public static String getUniqueID(Context context) { - final String id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); - return digest(context.getPackageName() + id); - } - - public static String getCarrier(Context context) { - TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - String carrier = tm.getNetworkOperatorName(); - if (TextUtils.isEmpty(carrier)) { - carrier = "Unknown"; - } - return carrier; - } - - public static String getCarrierId(Context context) { - TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - String carrierId = tm.getNetworkOperator(); - if (TextUtils.isEmpty(carrierId)) { - carrierId = "0"; - } - return carrierId; - } - - public static String getCountryCode(Context context) { - TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - String countryCode = tm.getNetworkCountryIso(); - if (TextUtils.isEmpty(countryCode)) { - countryCode = "Unknown"; - } - return countryCode; - } - - public static String getDevice() { - return SystemProperties.get("ro.cm.device", Build.PRODUCT); - } - - public static String getModVersion() { - return SystemProperties.get("ro.cm.version", Build.DISPLAY); - } - - public static String digest(String input) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - return new BigInteger(1, md.digest(input.getBytes())).toString(16).toUpperCase(); - } catch (Exception e) { - return null; - } - } - - /** - * Check to see if global stats are enabled. - * @param context - * @return Whether or not stats collection is enabled. - */ - public static boolean isStatsCollectionEnabled(Context context) { - return CMSettings.Secure.getInt(context.getContentResolver(), - CMSettings.Secure.STATS_COLLECTION, 1) != 0; - } - - /** - * Enabled or disable stats collection - * @param context - * @param enabled Boolean that sets collection being enabled. - */ - public static void setStatsCollectionEnabled(Context context, boolean enabled) { - int enable = (enabled) ? 1 : 0; - CMSettings.Secure.putInt(context.getContentResolver(), - CMSettings.Secure.STATS_COLLECTION, enable); - } -} |