diff --git a/metadata/net.nurik.roman.muzei.txt b/metadata/net.nurik.roman.muzei.txt index e581cfa552..2db9f07000 100644 --- a/metadata/net.nurik.roman.muzei.txt +++ b/metadata/net.nurik.roman.muzei.txt @@ -52,15 +52,22 @@ Build:2.3.1,23124 gradle=prod rm=wearable,example-watchface +Build:2.4.0,24016 + commit=v2.4.0-rc2 + subdir=main + patch=2.4.0-remove-play-services.patch + gradle=yes + rm=wearable,example-watchface + Maintainer Notes: Custom version format, so no UCM applies. Since 2.0, source code needs to be patched to get rid of Google Play Services. -The wearable and example-watchface components should be removed completely, the -rest of the code has be cleaned up from FirebaseAnalytics. +The "wearable" and "example-watchface" components should be removed +completely, the rest of the code has to be cleaned up from FirebaseAnalytics. . Auto Update Mode:None Update Check Mode:None -Current Version:2.3.1 -Current Version Code:23124 +Current Version:2.4.0 +Current Version Code:24016 diff --git a/metadata/net.nurik.roman.muzei/2.4.0-remove-play-services.patch b/metadata/net.nurik.roman.muzei/2.4.0-remove-play-services.patch new file mode 100644 index 0000000000..c9cb3690fc --- /dev/null +++ b/metadata/net.nurik.roman.muzei/2.4.0-remove-play-services.patch @@ -0,0 +1,769 @@ +diff --git a/android-client-common/build.gradle b/android-client-common/build.gradle +index d0c4761..73f45a9 100644 +--- a/android-client-common/build.gradle ++++ b/android-client-common/build.gradle +@@ -25,9 +25,6 @@ dependencies { + implementation "com.android.support:support-fragment:$rootProject.ext.supportLibraryVersion" + api "android.arch.persistence.room:runtime:$rootProject.ext.roomVersion" + annotationProcessor "android.arch.persistence.room:compiler:$rootProject.ext.roomVersion" +- api ("com.google.android.gms:play-services-wearable:$rootProject.ext.googlePlayServicesVersion") { +- exclude module: 'support-v4' +- } + } + + android { +diff --git a/android-client-common/src/main/java/com/google/android/apps/muzei/wearable/ArtworkTransfer.java b/android-client-common/src/main/java/com/google/android/apps/muzei/wearable/ArtworkTransfer.java +deleted file mode 100644 +index ec281b1..0000000 +--- a/android-client-common/src/main/java/com/google/android/apps/muzei/wearable/ArtworkTransfer.java ++++ /dev/null +@@ -1,74 +0,0 @@ +-/* +- * Copyright 2017 Google Inc. +- * +- * 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.google.android.apps.muzei.wearable; +- +-import android.net.Uri; +-import android.os.Bundle; +-import android.text.TextUtils; +- +-import com.google.android.apps.muzei.room.Artwork; +-import com.google.android.gms.wearable.DataMap; +- +-/** +- * Helper class for transferring {@link Artwork} over to Wearable devices +- */ +-public class ArtworkTransfer { +- private static final String KEY_IMAGE_URI = "imageUri"; +- private static final String KEY_TITLE = "title"; +- private static final String KEY_BYLINE = "byline"; +- private static final String KEY_ATTRIBUTION = "attribution"; +- private static final String KEY_TOKEN = "token"; +- +- /** +- * Serializes this artwork object to a {@link DataMap} representation. +- * +- * @return a serialized version of the artwork. +- * @see #fromDataMap +- */ +- public static DataMap toDataMap(Artwork artwork) { +- Bundle bundle = new Bundle(); +- bundle.putString(KEY_IMAGE_URI, (artwork.imageUri != null) ? artwork.imageUri.toString() : null); +- bundle.putString(KEY_TITLE, artwork.title); +- bundle.putString(KEY_BYLINE, artwork.byline); +- bundle.putString(KEY_ATTRIBUTION, artwork.attribution); +- bundle.putString(KEY_TOKEN, artwork.token); +- return DataMap.fromBundle(bundle); +- } +- +- /** +- * Deserializes an artwork object from a {@link DataMap}. +- * +- * @param dataMap DataMap generated by {@link #toDataMap} to deserialize. +- * @return the artwork from the given {@link DataMap} +- */ +- public static Artwork fromDataMap(DataMap dataMap) { +- Bundle bundle = dataMap.toBundle(); +- Artwork artwork = new Artwork(); +- String imageUri = bundle.getString(KEY_IMAGE_URI); +- if (!TextUtils.isEmpty(imageUri)) { +- artwork.imageUri = Uri.parse(imageUri); +- } +- artwork.title = bundle.getString(KEY_TITLE); +- artwork.byline = bundle.getString(KEY_BYLINE); +- artwork.attribution = bundle.getString(KEY_ATTRIBUTION); +- artwork.token = bundle.getString(KEY_TOKEN); +- return artwork; +- } +- +- private ArtworkTransfer() { +- } +-} +diff --git a/build.gradle b/build.gradle +index 006c6bc..928ed08 100644 +--- a/build.gradle ++++ b/build.gradle +@@ -18,15 +18,9 @@ buildscript { + repositories { + jcenter() + google() +- maven { +- url 'https://maven.fabric.io/public' +- } + } + dependencies { + classpath 'com.android.tools.build:gradle:3.0.1' +- classpath 'com.google.gms:google-services:3.1.0' +- classpath 'io.fabric.tools:gradle:1.24.4' +- classpath 'com.google.firebase:firebase-plugins:1.1.1' + } + } + +diff --git a/main/build.gradle b/main/build.gradle +index 60a2cbd..551dc78 100644 +--- a/main/build.gradle ++++ b/main/build.gradle +@@ -15,8 +15,6 @@ + */ + + apply plugin: 'com.android.application' +-apply plugin: 'com.google.firebase.firebase-perf' +-apply plugin: 'io.fabric' + + project.archivesBaseName = "muzei" + +@@ -89,10 +87,6 @@ android { + dependencies { + implementation "com.squareup.okhttp3:okhttp:$rootProject.ext.okhttpVersion" + implementation "com.squareup.picasso:picasso:$rootProject.ext.picassoVersion" +- implementation "com.google.android.gms:play-services-wearable:$rootProject.ext.googlePlayServicesVersion" +- implementation "com.google.firebase:firebase-core:$rootProject.ext.googlePlayServicesVersion" +- implementation "com.google.firebase:firebase-perf:$rootProject.ext.googlePlayServicesVersion" +- implementation "com.crashlytics.sdk.android:crashlytics:$rootProject.ext.crashlyticsVersion" + implementation "com.twofortyfouram:android-plugin-api-for-locale:1.0.2" + implementation "org.greenrobot:eventbus:3.0.0" + implementation "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion" +@@ -108,5 +102,3 @@ dependencies { + implementation project(':source-featured-art') + implementation project(':source-gallery') + } +- +-apply plugin: 'com.google.gms.google-services' +\ No newline at end of file +diff --git a/main/src/main/java/com/google/android/apps/muzei/ArtDetailFragment.java b/main/src/main/java/com/google/android/apps/muzei/ArtDetailFragment.java +index 638b7d3..79b12da 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/ArtDetailFragment.java ++++ b/main/src/main/java/com/google/android/apps/muzei/ArtDetailFragment.java +@@ -58,7 +58,6 @@ import com.google.android.apps.muzei.util.AnimatedMuzeiLoadingSpinnerView; + import com.google.android.apps.muzei.util.PanScaleProxyView; + import com.google.android.apps.muzei.util.ScrimUtil; + import com.google.android.apps.muzei.widget.AppWidgetUpdateTask; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.R; + +@@ -266,7 +265,6 @@ public class ArtDetailFragment extends Fragment { + + switch (menuItem.getItemId()) { + case R.id.action_about: +- FirebaseAnalytics.getInstance(context).logEvent("about_open", null); + startActivity(new Intent(context, AboutActivity.class)); + return true; + } +diff --git a/main/src/main/java/com/google/android/apps/muzei/IntroFragment.java b/main/src/main/java/com/google/android/apps/muzei/IntroFragment.java +index d3fd494..0e9e16a 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/IntroFragment.java ++++ b/main/src/main/java/com/google/android/apps/muzei/IntroFragment.java +@@ -30,7 +30,6 @@ import android.view.ViewGroup; + import android.widget.Toast; + + import com.google.android.apps.muzei.util.AnimatedMuzeiLogoFragment; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.R; + +@@ -43,10 +42,6 @@ public class IntroFragment extends Fragment { + @Override + public void onCreate(@Nullable final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +- +- if (savedInstanceState == null) { +- FirebaseAnalytics.getInstance(getContext()).logEvent(FirebaseAnalytics.Event.TUTORIAL_BEGIN, null); +- } + } + + @Override +@@ -61,7 +56,6 @@ public class IntroFragment extends Fragment { + mActivateButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { +- FirebaseAnalytics.getInstance(getContext()).logEvent("activate", null); + try { + startActivity(new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER) + .putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, +diff --git a/main/src/main/java/com/google/android/apps/muzei/MainFragment.java b/main/src/main/java/com/google/android/apps/muzei/MainFragment.java +index 33a3116..8529951 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/MainFragment.java ++++ b/main/src/main/java/com/google/android/apps/muzei/MainFragment.java +@@ -38,7 +38,6 @@ import android.view.ViewGroup; + import com.google.android.apps.muzei.settings.EffectsFragment; + import com.google.android.apps.muzei.settings.ChooseSourceFragment; + import com.google.android.apps.muzei.util.ScrimUtil; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.R; + +@@ -86,9 +85,6 @@ public class MainFragment extends Fragment implements FragmentManager.OnBackStac + // Set up the container for the child fragments + final View container = view.findViewById(R.id.container); + if (savedInstanceState == null) { +- FirebaseAnalytics.getInstance(getActivity()) +- .setCurrentScreen(getActivity(), "ArtDetail", +- ArtDetailFragment.class.getSimpleName()); + getChildFragmentManager().beginTransaction() + .replace(R.id.container, new ArtDetailFragment()) + .commit(); +@@ -106,18 +102,12 @@ public class MainFragment extends Fragment implements FragmentManager.OnBackStac + } + switch (item.getItemId()) { + case R.id.main_art_details: +- FirebaseAnalytics.getInstance(getContext()) +- .setCurrentScreen(getActivity(), "ArtDetail", +- ArtDetailFragment.class.getSimpleName()); + getChildFragmentManager().beginTransaction() + .replace(R.id.container, new ArtDetailFragment()) + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) + .commit(); + return true; + case R.id.main_choose_source: +- FirebaseAnalytics.getInstance(getContext()) +- .setCurrentScreen(getActivity(), "ChooseSource", +- ChooseSourceFragment.class.getSimpleName()); + getChildFragmentManager().popBackStack("main", + FragmentManager.POP_BACK_STACK_INCLUSIVE); + getChildFragmentManager().beginTransaction() +@@ -127,9 +117,6 @@ public class MainFragment extends Fragment implements FragmentManager.OnBackStac + .commit(); + return true; + case R.id.main_effects: +- FirebaseAnalytics.getInstance(getContext()) +- .setCurrentScreen(getActivity(), "Effects", +- EffectsFragment.class.getSimpleName()); + getChildFragmentManager().popBackStack("main", + FragmentManager.POP_BACK_STACK_INCLUSIVE); + getChildFragmentManager().beginTransaction() +diff --git a/main/src/main/java/com/google/android/apps/muzei/MuzeiActivity.java b/main/src/main/java/com/google/android/apps/muzei/MuzeiActivity.java +index 828457c..c096346 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/MuzeiActivity.java ++++ b/main/src/main/java/com/google/android/apps/muzei/MuzeiActivity.java +@@ -25,7 +25,6 @@ import android.support.v7.app.AppCompatActivity; + import android.view.View; + + import com.google.android.apps.muzei.event.WallpaperActiveStateChangedEvent; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.BuildConfig; + import net.nurik.roman.muzei.R; +@@ -42,7 +41,6 @@ public class MuzeiActivity extends AppCompatActivity + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.muzei_activity); +- FirebaseAnalytics.getInstance(this).setUserProperty("device_type", BuildConfig.DEVICE_TYPE); + final View mContainerView = findViewById(R.id.container); + + mContainerView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN +@@ -70,19 +68,13 @@ public class MuzeiActivity extends AppCompatActivity + final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); + if (sp.getBoolean(TutorialFragment.PREF_SEEN_TUTORIAL, false)) { + // The wallpaper is active and they've seen the tutorial +- FirebaseAnalytics.getInstance(this).setCurrentScreen(this, "Main", +- MainFragment.class.getSimpleName()); + return new MainFragment(); + } else { + // They need to see the tutorial after activating Muzei for the first time +- FirebaseAnalytics.getInstance(this).setCurrentScreen(this, "Tutorial", +- TutorialFragment.class.getSimpleName()); + return new TutorialFragment(); + } + } else { + // Show the intro fragment to have them activate Muzei +- FirebaseAnalytics.getInstance(this).setCurrentScreen(this, "Intro", +- IntroFragment.class.getSimpleName()); + return new IntroFragment(); + } + } +diff --git a/main/src/main/java/com/google/android/apps/muzei/MuzeiWallpaperService.java b/main/src/main/java/com/google/android/apps/muzei/MuzeiWallpaperService.java +index ac397fb..7f45812 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/MuzeiWallpaperService.java ++++ b/main/src/main/java/com/google/android/apps/muzei/MuzeiWallpaperService.java +@@ -55,7 +55,6 @@ import com.google.android.apps.muzei.shortcuts.ArtworkInfoShortcutController; + import com.google.android.apps.muzei.wallpaper.LockscreenObserver; + import com.google.android.apps.muzei.wallpaper.NetworkChangeObserver; + import com.google.android.apps.muzei.wallpaper.WallpaperAnalytics; +-import com.google.android.apps.muzei.wearable.WearableController; + import com.google.android.apps.muzei.widget.WidgetUpdater; + + import net.rbgrn.android.glwallpaperservice.GLWallpaperService; +@@ -84,7 +83,6 @@ public class MuzeiWallpaperService extends GLWallpaperService implements Lifecyc + mLifecycle.addObserver(new SourceManager(this)); + mLifecycle.addObserver(new NetworkChangeObserver(this)); + mLifecycle.addObserver(new NotificationUpdater(this)); +- mLifecycle.addObserver(new WearableController(this)); + mLifecycle.addObserver(new WidgetUpdater(this)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + mLifecycle.addObserver(new ArtworkInfoShortcutController(this, this)); +diff --git a/main/src/main/java/com/google/android/apps/muzei/PhotoSetAsTargetActivity.java b/main/src/main/java/com/google/android/apps/muzei/PhotoSetAsTargetActivity.java +index 202d12b..036a277 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/PhotoSetAsTargetActivity.java ++++ b/main/src/main/java/com/google/android/apps/muzei/PhotoSetAsTargetActivity.java +@@ -31,7 +31,6 @@ import android.widget.Toast; + import com.google.android.apps.muzei.gallery.ChosenPhoto; + import com.google.android.apps.muzei.gallery.GalleryArtSource; + import com.google.android.apps.muzei.gallery.GalleryDatabase; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.R; + +@@ -64,11 +63,6 @@ public class PhotoSetAsTargetActivity extends Activity { + } + + // If adding the artwork succeeded, select the gallery source and publish the new image +- Bundle bundle = new Bundle(); +- bundle.putString(FirebaseAnalytics.Param.ITEM_ID, +- new ComponentName(context, GalleryArtSource.class).flattenToShortString()); +- bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "sources"); +- FirebaseAnalytics.getInstance(context).logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle); + SourceManager.selectSource(context, new ComponentName(context, GalleryArtSource.class), + new SourceManager.Callback() { + @Override +diff --git a/main/src/main/java/com/google/android/apps/muzei/SourceManager.java b/main/src/main/java/com/google/android/apps/muzei/SourceManager.java +index edc7d75..4d48bcc 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/SourceManager.java ++++ b/main/src/main/java/com/google/android/apps/muzei/SourceManager.java +@@ -37,7 +37,6 @@ import com.google.android.apps.muzei.featuredart.FeaturedArtSource; + import com.google.android.apps.muzei.room.MuzeiDatabase; + import com.google.android.apps.muzei.room.Source; + import com.google.android.apps.muzei.sync.TaskQueueService; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.BuildConfig; + import net.nurik.roman.muzei.R; +@@ -176,15 +175,11 @@ public class SourceManager implements LifecycleObserver { + if (packageName.length() > MAX_VALUE_LENGTH) { + packageName = packageName.substring(packageName.length() - MAX_VALUE_LENGTH); + } +- FirebaseAnalytics.getInstance(context).setUserProperty(USER_PROPERTY_SELECTED_SOURCE_PACKAGE, +- packageName); + String className = selectedSource.flattenToShortString(); + className = className.substring(className.indexOf('/')+1); + if (className.length() > MAX_VALUE_LENGTH) { + className = className.substring(className.length() - MAX_VALUE_LENGTH); + } +- FirebaseAnalytics.getInstance(context).setUserProperty(USER_PROPERTY_SELECTED_SOURCE, +- className); + } + + public static void sendAction(final Context context, final int id) { +diff --git a/main/src/main/java/com/google/android/apps/muzei/TutorialFragment.java b/main/src/main/java/com/google/android/apps/muzei/TutorialFragment.java +index a236497..15c827f 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/TutorialFragment.java ++++ b/main/src/main/java/com/google/android/apps/muzei/TutorialFragment.java +@@ -36,8 +36,6 @@ import android.view.animation.Interpolator; + import android.view.animation.OvershootInterpolator; + import android.widget.ImageView; + +-import com.google.firebase.analytics.FirebaseAnalytics; +- + import net.nurik.roman.muzei.R; + + public class TutorialFragment extends Fragment { +@@ -59,8 +57,6 @@ public class TutorialFragment extends Fragment { + new View.OnClickListener() { + @Override + public void onClick(View view) { +- FirebaseAnalytics.getInstance(getContext()) +- .logEvent(FirebaseAnalytics.Event.TUTORIAL_COMPLETE, null); + final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); + sp.edit().putBoolean(PREF_SEEN_TUTORIAL, true).apply(); + } +diff --git a/main/src/main/java/com/google/android/apps/muzei/quicksettings/NextArtworkTileService.java b/main/src/main/java/com/google/android/apps/muzei/quicksettings/NextArtworkTileService.java +index f9dbe09..8b05fd0 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/quicksettings/NextArtworkTileService.java ++++ b/main/src/main/java/com/google/android/apps/muzei/quicksettings/NextArtworkTileService.java +@@ -40,7 +40,6 @@ import com.google.android.apps.muzei.api.MuzeiArtSource; + import com.google.android.apps.muzei.event.WallpaperActiveStateChangedEvent; + import com.google.android.apps.muzei.room.MuzeiDatabase; + import com.google.android.apps.muzei.room.Source; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.R; + +@@ -73,7 +72,6 @@ public class NextArtworkTileService extends TileService implements LifecycleOwne + + @Override + public void onTileAdded() { +- FirebaseAnalytics.getInstance(this).logEvent("tile_next_artwork_added", null); + } + + @Override +@@ -141,8 +139,6 @@ public class NextArtworkTileService extends TileService implements LifecycleOwne + return; + } + if (tile.getState() == Tile.STATE_ACTIVE) { +- FirebaseAnalytics.getInstance(NextArtworkTileService.this).logEvent( +- "tile_next_artwork_click", null); + // Active means we send the 'Next Artwork' command + SourceManager.sendAction(this, MuzeiArtSource.BUILTIN_COMMAND_ID_NEXT_ARTWORK); + } else { +@@ -150,8 +146,6 @@ public class NextArtworkTileService extends TileService implements LifecycleOwne + unlockAndRun(new Runnable() { + @Override + public void run() { +- FirebaseAnalytics.getInstance(NextArtworkTileService.this).logEvent( +- "tile_next_artwork_activate", null); + try { + startActivityAndCollapse(new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER) + .putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, +@@ -180,7 +174,6 @@ public class NextArtworkTileService extends TileService implements LifecycleOwne + + @Override + public void onTileRemoved() { +- FirebaseAnalytics.getInstance(this).logEvent("tile_next_artwork_removed", null); + } + + @Override +diff --git a/main/src/main/java/com/google/android/apps/muzei/settings/ChooseSourceFragment.java b/main/src/main/java/com/google/android/apps/muzei/settings/ChooseSourceFragment.java +index 6bd2dc5..07ad04a 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/settings/ChooseSourceFragment.java ++++ b/main/src/main/java/com/google/android/apps/muzei/settings/ChooseSourceFragment.java +@@ -69,7 +69,6 @@ import com.google.android.apps.muzei.notifications.NotificationSettingsDialogFra + import com.google.android.apps.muzei.room.MuzeiDatabase; + import com.google.android.apps.muzei.util.ObservableHorizontalScrollView; + import com.google.android.apps.muzei.util.Scrollbar; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.R; + +@@ -141,10 +140,6 @@ public class ChooseSourceFragment extends Fragment { + public void onAttach(Context context) { + super.onAttach(context); + +- Bundle bundle = new Bundle(); +- bundle.putString(FirebaseAnalytics.Param.ITEM_CATEGORY, "sources"); +- FirebaseAnalytics.getInstance(context).logEvent(FirebaseAnalytics.Event.VIEW_ITEM_LIST, bundle); +- + mCurrentSourceLiveData = MuzeiDatabase.getInstance(context).sourceDao().getCurrentSource(); + mCurrentSourceLiveData.observe(this, + new Observer() { +@@ -157,7 +152,6 @@ public class ChooseSourceFragment extends Fragment { + Intent intent = ((Activity) context).getIntent(); + if (intent != null && intent.getCategories() != null && + intent.getCategories().contains(Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES)) { +- FirebaseAnalytics.getInstance(context).logEvent("notification_preferences_open", null); + NotificationSettingsDialogFragment.showSettings(this); + } + } +@@ -175,7 +169,6 @@ public class ChooseSourceFragment extends Fragment { + NotificationSettingsDialogFragment.showSettings(this); + return true; + case R.id.action_get_more_sources: +- FirebaseAnalytics.getInstance(getContext()).logEvent("more_sources_open", null); + try { + Intent playStoreIntent = new Intent(Intent.ACTION_VIEW, + Uri.parse("http://play.google.com/store/search?q=Muzei&c=apps")) +@@ -557,18 +550,9 @@ public class ChooseSourceFragment extends Fragment { + } + builder.show(); + } else if (source.setupActivity != null) { +- Bundle bundle = new Bundle(); +- bundle.putString(FirebaseAnalytics.Param.ITEM_ID, source.componentName.flattenToShortString()); +- bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, source.label); +- bundle.putString(FirebaseAnalytics.Param.ITEM_CATEGORY, "sources"); +- FirebaseAnalytics.getInstance(getContext()).logEvent(FirebaseAnalytics.Event.VIEW_ITEM, bundle); + mCurrentInitialSetupSource = source.componentName; + launchSourceSetup(source); + } else { +- Bundle bundle = new Bundle(); +- bundle.putString(FirebaseAnalytics.Param.ITEM_ID, source.componentName.flattenToShortString()); +- bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "sources"); +- FirebaseAnalytics.getInstance(getContext()).logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle); + SourceManager.selectSource(getContext(), source.componentName); + } + } +@@ -652,10 +636,6 @@ public class ChooseSourceFragment extends Fragment { + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_EXTENSION_SETUP) { + if (resultCode == Activity.RESULT_OK && mCurrentInitialSetupSource != null) { +- Bundle bundle = new Bundle(); +- bundle.putString(FirebaseAnalytics.Param.ITEM_ID, mCurrentInitialSetupSource.flattenToShortString()); +- bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "sources"); +- FirebaseAnalytics.getInstance(getContext()).logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle); + SourceManager.selectSource(getContext(), mCurrentInitialSetupSource); + } + +diff --git a/main/src/main/java/com/google/android/apps/muzei/settings/SettingsActivity.java b/main/src/main/java/com/google/android/apps/muzei/settings/SettingsActivity.java +index b3b77f6..fb3eeab 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/settings/SettingsActivity.java ++++ b/main/src/main/java/com/google/android/apps/muzei/settings/SettingsActivity.java +@@ -33,7 +33,6 @@ import android.widget.TextView; + + import com.google.android.apps.muzei.event.WallpaperActiveStateChangedEvent; + import com.google.android.apps.muzei.render.MuzeiRendererFragment; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.R; + +@@ -164,9 +163,6 @@ public class SettingsActivity extends AppCompatActivity + + try { + Fragment newFragment = fragmentClass.newInstance(); +- FirebaseAnalytics.getInstance(SettingsActivity.this) +- .setCurrentScreen(SettingsActivity.this, SECTION_SCREEN_NAME[position], +- fragmentClass.getSimpleName()); + getSupportFragmentManager().beginTransaction() + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) + .setTransitionStyle(R.style.Muzei_SimpleFadeFragmentAnimation) +diff --git a/main/src/main/java/com/google/android/apps/muzei/wallpaper/WallpaperAnalytics.java b/main/src/main/java/com/google/android/apps/muzei/wallpaper/WallpaperAnalytics.java +index 6cfa4f9..7491f2c 100644 +--- a/main/src/main/java/com/google/android/apps/muzei/wallpaper/WallpaperAnalytics.java ++++ b/main/src/main/java/com/google/android/apps/muzei/wallpaper/WallpaperAnalytics.java +@@ -22,7 +22,6 @@ import android.arch.lifecycle.OnLifecycleEvent; + import android.content.Context; + + import com.google.android.apps.muzei.event.WallpaperActiveStateChangedEvent; +-import com.google.firebase.analytics.FirebaseAnalytics; + + import net.nurik.roman.muzei.BuildConfig; + +@@ -40,18 +39,15 @@ public class WallpaperAnalytics implements LifecycleObserver { + + @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) + public void registerDeviceType() { +- FirebaseAnalytics.getInstance(mContext).setUserProperty("device_type", BuildConfig.DEVICE_TYPE); + } + + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + public void triggerWallpaperCreated() { +- FirebaseAnalytics.getInstance(mContext).logEvent("wallpaper_created", null); + EventBus.getDefault().postSticky(new WallpaperActiveStateChangedEvent(true)); + } + + @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) + public void triggerWallpaperDestroyed() { +- FirebaseAnalytics.getInstance(mContext).logEvent("wallpaper_destroyed", null); + EventBus.getDefault().postSticky(new WallpaperActiveStateChangedEvent(false)); + } + } +diff --git a/main/src/main/java/com/google/android/apps/muzei/wearable/NotificationOpenListenerService.java b/main/src/main/java/com/google/android/apps/muzei/wearable/NotificationOpenListenerService.java +deleted file mode 100644 +index aa55e66..0000000 +--- a/main/src/main/java/com/google/android/apps/muzei/wearable/NotificationOpenListenerService.java ++++ /dev/null +@@ -1,33 +0,0 @@ +-/* +- * Copyright 2014 Google Inc. +- * +- * 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.google.android.apps.muzei.wearable; +- +-import android.content.Intent; +-import android.content.pm.PackageManager; +- +-import com.google.android.gms.wearable.MessageEvent; +-import com.google.android.gms.wearable.WearableListenerService; +- +-public class NotificationOpenListenerService extends WearableListenerService { +- @Override +- public void onMessageReceived(MessageEvent messageEvent) { +- // Only notification/open actions trigger this WearableListenerService +- PackageManager packageManager = getPackageManager(); +- Intent mainIntent = packageManager.getLaunchIntentForPackage(getPackageName()); +- startActivity(mainIntent); +- } +-} +diff --git a/main/src/main/java/com/google/android/apps/muzei/wearable/WearableController.java b/main/src/main/java/com/google/android/apps/muzei/wearable/WearableController.java +deleted file mode 100644 +index e113ed2..0000000 +--- a/main/src/main/java/com/google/android/apps/muzei/wearable/WearableController.java ++++ /dev/null +@@ -1,175 +0,0 @@ +-/* +- * Copyright 2014 Google Inc. +- * +- * 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.google.android.apps.muzei.wearable; +- +-import android.arch.lifecycle.Lifecycle; +-import android.arch.lifecycle.LifecycleObserver; +-import android.arch.lifecycle.OnLifecycleEvent; +-import android.content.ContentResolver; +-import android.content.Context; +-import android.database.ContentObserver; +-import android.graphics.Bitmap; +-import android.graphics.BitmapFactory; +-import android.graphics.Matrix; +-import android.net.Uri; +-import android.os.Handler; +-import android.os.HandlerThread; +-import android.support.media.ExifInterface; +-import android.util.Log; +- +-import com.google.android.apps.muzei.api.MuzeiContract; +-import com.google.android.apps.muzei.render.ImageUtil; +-import com.google.android.apps.muzei.room.Artwork; +-import com.google.android.apps.muzei.room.MuzeiDatabase; +-import com.google.android.gms.common.ConnectionResult; +-import com.google.android.gms.common.GoogleApiAvailability; +-import com.google.android.gms.common.api.AvailabilityException; +-import com.google.android.gms.tasks.Tasks; +-import com.google.android.gms.wearable.Asset; +-import com.google.android.gms.wearable.DataClient; +-import com.google.android.gms.wearable.PutDataMapRequest; +-import com.google.android.gms.wearable.Wearable; +- +-import java.io.ByteArrayOutputStream; +-import java.io.FileNotFoundException; +-import java.io.IOException; +-import java.io.InputStream; +-import java.util.concurrent.ExecutionException; +-import java.util.concurrent.TimeUnit; +-import java.util.concurrent.TimeoutException; +- +-/** +- * Controller for updating Android Wear devices with new wallpapers. +- */ +-public class WearableController implements LifecycleObserver { +- private static final String TAG = "WearableController"; +- +- private final Context mContext; +- private HandlerThread mWearableHandlerThread; +- private ContentObserver mWearableContentObserver; +- +- public WearableController(Context context) { +- mContext = context; +- } +- +- @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) +- public void registerContentObserver() { +- // Set up a thread to update Android Wear whenever the artwork changes +- mWearableHandlerThread = new HandlerThread("MuzeiWallpaperService-Wearable"); +- mWearableHandlerThread.start(); +- mWearableContentObserver = new ContentObserver(new Handler(mWearableHandlerThread.getLooper())) { +- @Override +- public void onChange(final boolean selfChange, final Uri uri) { +- updateArtwork(); +- } +- }; +- mContext.getContentResolver().registerContentObserver(MuzeiContract.Artwork.CONTENT_URI, +- true, mWearableContentObserver); +- } +- +- @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) +- public void unregisterContentObserver() { +- mContext.getContentResolver().unregisterContentObserver(mWearableContentObserver); +- mWearableHandlerThread.quitSafely(); +- } +- +- private void updateArtwork() { +- if (ConnectionResult.SUCCESS != GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mContext)) { +- return; +- } +- DataClient dataClient = Wearable.getDataClient(mContext); +- try { +- Tasks.await(GoogleApiAvailability.getInstance() +- .checkApiAvailability(dataClient), 5, TimeUnit.SECONDS); +- } catch (ExecutionException e) { +- if (e.getCause() instanceof AvailabilityException) { +- ConnectionResult connectionResult = ((AvailabilityException) e.getCause()) +- .getConnectionResult(dataClient); +- if (connectionResult.getErrorCode() != ConnectionResult.API_UNAVAILABLE) { +- Log.w(TAG, "onConnectionFailed: " + connectionResult, e.getCause()); +- } +- } else { +- Log.w(TAG, "Unable to check for Wear API availability", e); +- } +- return; +- } catch (InterruptedException|TimeoutException e) { +- Log.w(TAG, "Unable to check for Wear API availability", e); +- return; +- } +- ContentResolver contentResolver = mContext.getContentResolver(); +- Bitmap image = null; +- try { +- BitmapFactory.Options options = new BitmapFactory.Options(); +- options.inJustDecodeBounds = true; +- BitmapFactory.decodeStream(contentResolver.openInputStream( +- MuzeiContract.Artwork.CONTENT_URI), null, options); +- options.inJustDecodeBounds = false; +- if (options.outWidth > options.outHeight) { +- options.inSampleSize = ImageUtil.calculateSampleSize(options.outHeight, 320); +- } else { +- options.inSampleSize = ImageUtil.calculateSampleSize(options.outWidth, 320); +- } +- image = BitmapFactory.decodeStream(contentResolver.openInputStream( +- MuzeiContract.Artwork.CONTENT_URI), null, options); +- } catch (FileNotFoundException e) { +- Log.e(TAG, "Unable to read artwork to update Android Wear", e); +- } +- if (image != null) { +- int rotation = getRotation(); +- if (rotation != 0) { +- // Rotate the image so that Wear always gets a right side up image +- Matrix matrix = new Matrix(); +- matrix.postRotate(rotation); +- image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), +- matrix, true); +- } +- final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); +- image.compress(Bitmap.CompressFormat.PNG, 100, byteStream); +- Asset asset = Asset.createFromBytes(byteStream.toByteArray()); +- PutDataMapRequest dataMapRequest = PutDataMapRequest.create("/artwork"); +- Artwork artwork = MuzeiDatabase.getInstance(mContext).artworkDao().getCurrentArtworkBlocking(); +- dataMapRequest.getDataMap().putDataMap("artwork", ArtworkTransfer.toDataMap(artwork)); +- dataMapRequest.getDataMap().putAsset("image", asset); +- try { +- Tasks.await(dataClient.putDataItem(dataMapRequest.asPutDataRequest().setUrgent())); +- } catch (ExecutionException|InterruptedException e) { +- Log.w(TAG, "Error uploading artwork to Wear", e); +- } +- } +- } +- +- private int getRotation() { +- ContentResolver contentResolver = mContext.getContentResolver(); +- int rotation = 0; +- try (InputStream in = contentResolver.openInputStream( +- MuzeiContract.Artwork.CONTENT_URI)) { +- if (in == null) { +- return 0; +- } +- ExifInterface exifInterface = new ExifInterface(in); +- int orientation = exifInterface.getAttributeInt( +- ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); +- switch (orientation) { +- case ExifInterface.ORIENTATION_ROTATE_90: rotation = 90; break; +- case ExifInterface.ORIENTATION_ROTATE_180: rotation = 180; break; +- case ExifInterface.ORIENTATION_ROTATE_270: rotation = 270; break; +- } +- } catch (IOException|NumberFormatException|StackOverflowError ignored) { +- } +- return rotation; +- } +-}