From 765e0b1d6a534b9e1e118f4f41bd66231851b9af Mon Sep 17 00:00:00 2001 From: Anita Woodruff Date: Mon, 14 Nov 2016 19:53:00 +0000 Subject: [PATCH 01/34] Tidying: remove unused import and variables from TasksFragment --- .../android/habitica/ui/fragments/tasks/TasksFragment.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index f35ef6d76..0caf51761 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -16,7 +16,6 @@ import com.habitrpg.android.habitica.events.commands.EditTagCommand; import com.habitrpg.android.habitica.events.commands.FilterTasksByTagsCommand; import com.habitrpg.android.habitica.events.commands.RefreshUserCommand; import com.habitrpg.android.habitica.events.commands.UpdateTagCommand; -import com.habitrpg.android.habitica.helpers.SoundManager; import com.habitrpg.android.habitica.helpers.TagsHelper; import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.habitrpg.android.habitica.ui.activities.TaskFormActivity; @@ -83,13 +82,10 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi MenuItem refreshItem; FloatingActionMenu floatingMenu; Map ViewFragmentsDictionary = new HashMap<>(); - private ArrayList tagNames; // Added this so other activities/fragments can get the String names, not IDs - private ArrayList tagIds; // Added this so other activities/fragments can get the IDs private boolean displayingTaskForm; private boolean editingTags; private List tags; - private List tagsCopy; private HashMap tagFilterMap = new HashMap<>(); private Debounce filterChangedHandler = new Debounce(1500, 1000) { @Override From 5947debd7c5284a877ad2a8e81d62921a5188f8e Mon Sep 17 00:00:00 2001 From: Anita Woodruff Date: Mon, 14 Nov 2016 19:56:07 +0000 Subject: [PATCH 02/34] Fill tag filter drawer in onActivityCreated not onCreate - fixes #654 --- .../ui/fragments/tasks/TasksFragment.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index 0caf51761..9ecb7beda 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -106,16 +106,6 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi super.setActivity(activity); } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (user != null) { - tags = user.getTags(); - fillTagFilterDrawer(tags); - } - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -151,6 +141,16 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi return v; } + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (user != null) { + tags = user.getTags(); + fillTagFilterDrawer(tags); + } + } + @Override public void injectFragment(AppComponent component) { component.inject(this); From 751bc76fd373994fea8a8804aa3cfe69d01d40cd Mon Sep 17 00:00:00 2001 From: d954mas Date: Thu, 17 Nov 2016 13:00:16 +0300 Subject: [PATCH 03/34] create proxy for crashlytics --- Habitica/build.gradle | 7 +- .../habitica/DebugDeveloperModule.java | 9 ++ .../android/habitica/HabiticaApplication.java | 19 ++++ .../habitrpg/android/habitica/APIHelper.java | 29 +++--- ...tion.java => HabiticaBaseApplication.java} | 35 ++++--- .../habitica/components/AppComponent.java | 32 ++++++- .../habitica/helpers/RemindersManager.java | 16 +++- .../habitica/helpers/TaskAlarmManager.java | 12 ++- .../android/habitica/modules/AppModule.java | 16 ++-- .../habitica/modules/DeveloperModule.java | 21 ++++ .../habitica/proxy/ifce/CrashlyticsProxy.java | 18 ++++ .../proxy/impl/EmptyCrashlyticsProxy.java | 38 ++++++++ .../habitica/ui/activities/MainActivity.java | 95 ++++++++----------- .../tasks/BaseTasksRecyclerViewAdapter.java | 13 ++- .../tasks/DailiesRecyclerViewHolder.java | 8 ++ .../tasks/HabitsRecyclerViewAdapter.java | 7 ++ .../tasks/RewardsRecyclerViewAdapter.java | 7 ++ .../tasks/TodosRecyclerViewAdapter.java | 7 ++ .../ui/fragments/GemsPurchaseFragment.java | 21 ++-- .../widget/AvatarStatsWidgetProvider.java | 4 +- .../widget/DailiesWidgetProvider.java | 3 +- .../widget/HabitButtonWidgetProvider.java | 3 +- .../android/habitica/HabiticaApplication.java | 18 ++++ .../habitica/ReleaseDeveloperModule.java | 9 ++ .../habitica/proxy/CrashlyticsProxyImpl.java | 47 +++++++++ 25 files changed, 369 insertions(+), 125 deletions(-) create mode 100644 Habitica/src/debug/java/com/habitrpg/android/habitica/DebugDeveloperModule.java create mode 100644 Habitica/src/debug/java/com/habitrpg/android/habitica/HabiticaApplication.java rename Habitica/src/main/java/com/habitrpg/android/habitica/{HabiticaApplication.java => HabiticaBaseApplication.java} (91%) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/proxy/ifce/CrashlyticsProxy.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/proxy/impl/EmptyCrashlyticsProxy.java create mode 100644 Habitica/src/release/java/com/habitrpg/android/habitica/HabiticaApplication.java create mode 100644 Habitica/src/release/java/com/habitrpg/android/habitica/ReleaseDeveloperModule.java create mode 100644 Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 94f743cab..ace0b5a53 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -55,7 +55,7 @@ dependencies { compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' //Crash Logging - compile('com.crashlytics.sdk.android:crashlytics:2.6.0@aar') { + releaseCompile('com.crashlytics.sdk.android:crashlytics:2.6.0@aar') { transitive = true; } @@ -179,7 +179,6 @@ android { signingConfig signingConfigs.release debuggable false multiDexEnabled true - resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider" resValue "string", "app_name", "Habitica" } @@ -200,15 +199,15 @@ android { java.srcDir file('src/test/java/') res.srcDirs = ['res'] } - release.setRoot('build-types/release') instrumentTest.setRoot('tests') + release { java.srcDirs = ['src/release/java'] } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - + dexOptions { preDexLibraries false javaMaxHeapSize "4g" // Use gig increments depending on needs diff --git a/Habitica/src/debug/java/com/habitrpg/android/habitica/DebugDeveloperModule.java b/Habitica/src/debug/java/com/habitrpg/android/habitica/DebugDeveloperModule.java new file mode 100644 index 000000000..6d0207804 --- /dev/null +++ b/Habitica/src/debug/java/com/habitrpg/android/habitica/DebugDeveloperModule.java @@ -0,0 +1,9 @@ +package com.habitrpg.android.habitica; + + +import com.habitrpg.android.habitica.modules.DeveloperModule; + +//change debug proxy here by override methods +public class DebugDeveloperModule extends DeveloperModule { + +} diff --git a/Habitica/src/debug/java/com/habitrpg/android/habitica/HabiticaApplication.java b/Habitica/src/debug/java/com/habitrpg/android/habitica/HabiticaApplication.java new file mode 100644 index 000000000..00537bda4 --- /dev/null +++ b/Habitica/src/debug/java/com/habitrpg/android/habitica/HabiticaApplication.java @@ -0,0 +1,19 @@ +package com.habitrpg.android.habitica; + +import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.components.DaggerAppComponent; +import com.habitrpg.android.habitica.modules.AppModule; + +import android.content.Context; + +public class HabiticaApplication extends HabiticaBaseApplication { + + @Override + protected AppComponent initDagger() { + return DaggerAppComponent.builder() + .appModule(new AppModule(this)) + .developerModule(new DebugDeveloperModule()) + .build(); + } + +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index a9489d821..8c468f1d6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -1,16 +1,14 @@ package com.habitrpg.android.habitica; -import android.app.Activity; -import android.support.v7.app.AlertDialog; - -import com.amplitude.api.Amplitude; -import com.crashlytics.android.Crashlytics; import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; + +import com.amplitude.api.Amplitude; import com.habitrpg.android.habitica.database.CheckListItemExcludeStrategy; +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; import com.magicmicky.habitrpgwrapper.lib.api.ApiService; import com.magicmicky.habitrpgwrapper.lib.api.Server; import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; @@ -67,6 +65,9 @@ import com.raizlabs.android.dbflow.structure.ModelAdapter; import org.json.JSONException; import org.json.JSONObject; +import android.app.Activity; +import android.support.v7.app.AlertDialog; + import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Type; @@ -79,6 +80,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.inject.Inject; import javax.net.ssl.SSLException; import okhttp3.Interceptor; @@ -100,6 +102,8 @@ import rx.schedulers.Schedulers; public class APIHelper implements Action1 { + @Inject + CrashlyticsProxy crashlyticsProxy; // I think we don't need the APIHelper anymore we could just use ApiService public final ApiService apiService; @@ -119,8 +123,9 @@ public class APIHelper implements Action1 { public APIHelper(GsonConverterFactory gsonConverter, HostConfig hostConfig) { this.gsonConverter = gsonConverter; this.hostConfig = hostConfig; - Crashlytics.getInstance().core.setUserIdentifier(this.hostConfig.getUser()); - Crashlytics.getInstance().core.setUserName(this.hostConfig.getUser()); + HabiticaBaseApplication.getComponent().inject(this); + crashlyticsProxy.setUserIdentifier(this.hostConfig.getUser()); + crashlyticsProxy.setUserName(this.hostConfig.getUser()); Amplitude.getInstance().setUserId(this.hostConfig.getUser()); Interceptor remove_data_interceptor = chain -> { @@ -144,7 +149,7 @@ public class APIHelper implements Action1 { } else { body = ResponseBody.create(contentType, stringJson); } - Crashlytics.setString("last_api_call", response.request().url().toString()); + crashlyticsProxy.setString("last_api_call",response.request().url().toString()); return response.newBuilder().body(body).build(); }; @@ -312,7 +317,7 @@ public class APIHelper implements Action1 { showConnectionProblemDialog(R.string.internal_error_api); } } else { - Crashlytics.logException(throwable); + crashlyticsProxy.logException(throwable); } } @@ -417,8 +422,8 @@ public class APIHelper implements Action1 { public void updateAuthenticationCredentials(String userID, String apiToken) { this.hostConfig.setUser(userID); this.hostConfig.setApi(apiToken); - Crashlytics.getInstance().core.setUserIdentifier(this.hostConfig.getUser()); - Crashlytics.getInstance().core.setUserName(this.hostConfig.getUser()); + crashlyticsProxy.setUserIdentifier(this.hostConfig.getUser()); + crashlyticsProxy.setUserName(this.hostConfig.getUser()); Amplitude.getInstance().setUserId(this.hostConfig.getUser()); } @@ -426,7 +431,7 @@ public class APIHelper implements Action1 { public String message; } - public ObservablegetContent() { + public Observable getContent() { return apiService.getContent(languageCode); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java similarity index 91% rename from Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java rename to Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java index be9c760ba..8b00df48c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java @@ -1,8 +1,6 @@ package com.habitrpg.android.habitica; import com.amplitude.api.Amplitude; -import com.crashlytics.android.Crashlytics; -import com.crashlytics.android.core.CrashlyticsCore; import com.facebook.FacebookSdk; import com.facebook.drawee.backends.pipeline.Fresco; import com.habitrpg.android.habitica.components.AppComponent; @@ -41,14 +39,13 @@ import android.util.Log; import java.io.File; import java.lang.reflect.Field; -import java.util.Arrays; import javax.inject.Inject; import dagger.Lazy; -import io.fabric.sdk.android.Fabric; -public class HabiticaApplication extends MultiDexApplication { +//contains all HabiticaApplicationLogic except dagger componentInitialisation +public abstract class HabiticaBaseApplication extends MultiDexApplication { public static HabitRPGUser User; public static Activity currentActivity = null; @@ -56,22 +53,22 @@ public class HabiticaApplication extends MultiDexApplication { Lazy lazyApiHelper; @Inject SharedPreferences sharedPrefs; - private AppComponent component; + private static AppComponent component; /** * For better performance billing class should be used as singleton */ @NonNull private Billing billing; /** - * Application wide {@link org.solovyev.android.checkout.Checkout} instance (can be used + * Application wide {@link Checkout} instance (can be used * anywhere in the app). * This instance contains all available products in the app. */ @NonNull private Checkout checkout; - public static HabiticaApplication getInstance(Context context) { - return (HabiticaApplication) context.getApplicationContext(); + public static HabiticaBaseApplication getInstance(Context context) { + return (HabiticaBaseApplication) context.getApplicationContext(); } public static boolean exists(@NonNull Context context) { @@ -167,12 +164,12 @@ public class HabiticaApplication extends MultiDexApplication { } private void setupDagger() { - component = DaggerAppComponent.builder() - .appModule(new AppModule(this)) - .build(); + component = initDagger(); component.inject(this); } + protected abstract AppComponent initDagger(); + private void setupLeakCanary() { // LeakCanary 1.3.1 has problems on Marshmallow; can remove check once updated with fixes if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { @@ -201,17 +198,17 @@ public class HabiticaApplication extends MultiDexApplication { } private void setupCrashlytics() { - Crashlytics crashlytics = new Crashlytics.Builder() + /* Crashlytics crashlytics = new Crashlytics.Builder() .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) .build(); - Fabric.with(this, crashlytics); + Fabric.with(this, crashlytics);*/ } private void registerActivityLifecycleCallbacks() { registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - HabiticaApplication.currentActivity = activity; + HabiticaBaseApplication.currentActivity = activity; } @Override @@ -221,7 +218,7 @@ public class HabiticaApplication extends MultiDexApplication { @Override public void onActivityResumed(Activity activity) { - HabiticaApplication.currentActivity = activity; + HabiticaBaseApplication.currentActivity = activity; } @Override @@ -314,7 +311,7 @@ public class HabiticaApplication extends MultiDexApplication { @Override public File getDatabasePath(String name) { File dbFile = new File(getExternalFilesDir(null), "HabiticaDatabase/" + name); - Crashlytics.setString("Database File", dbFile.getAbsolutePath()); + //Crashlytics.setString("Database File", dbFile.getAbsolutePath()); return dbFile; } @@ -334,7 +331,7 @@ public class HabiticaApplication extends MultiDexApplication { @Override public PurchaseVerifier getPurchaseVerifier() { - return new HabiticaPurchaseVerifier(HabiticaApplication.this, lazyApiHelper.get()); + return new HabiticaPurchaseVerifier(HabiticaBaseApplication.this, lazyApiHelper.get()); } }); @@ -349,7 +346,7 @@ public class HabiticaApplication extends MultiDexApplication { // endregion - public AppComponent getComponent() { + public static AppComponent getComponent() { return component; } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 5c228a15b..2776b2118 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -1,10 +1,14 @@ package com.habitrpg.android.habitica.components; -import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaBaseApplication; +import com.habitrpg.android.habitica.helpers.RemindersManager; import com.habitrpg.android.habitica.helpers.SoundManager; +import com.habitrpg.android.habitica.helpers.TaskAlarmManager; import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; import com.habitrpg.android.habitica.modules.ApiModule; import com.habitrpg.android.habitica.modules.AppModule; +import com.habitrpg.android.habitica.modules.DeveloperModule; import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; import com.habitrpg.android.habitica.ui.activities.AboutActivity; import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity; @@ -21,6 +25,11 @@ import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.activities.SkillMemberActivity; import com.habitrpg.android.habitica.ui.activities.SkillTasksActivity; import com.habitrpg.android.habitica.ui.activities.TaskFormActivity; +import com.habitrpg.android.habitica.ui.adapter.tasks.BaseTasksRecyclerViewAdapter; +import com.habitrpg.android.habitica.ui.adapter.tasks.DailiesRecyclerViewHolder; +import com.habitrpg.android.habitica.ui.adapter.tasks.HabitsRecyclerViewAdapter; +import com.habitrpg.android.habitica.ui.adapter.tasks.RewardsRecyclerViewAdapter; +import com.habitrpg.android.habitica.ui.adapter.tasks.TodosRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment; import com.habitrpg.android.habitica.ui.fragments.NewsFragment; import com.habitrpg.android.habitica.ui.fragments.faq.FAQDetailFragment; @@ -56,6 +65,7 @@ import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragme import com.habitrpg.android.habitica.ui.fragments.social.party.PartyMemberListFragment; import com.habitrpg.android.habitica.ui.fragments.tasks.TaskRecyclerViewFragment; import com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment; +import com.habitrpg.android.habitica.ui.viewHolders.tasks.BaseTaskViewHolder; import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider; import com.habitrpg.android.habitica.widget.DailiesWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; @@ -66,7 +76,7 @@ import javax.inject.Singleton; import dagger.Component; @Singleton -@Component(modules = {AppModule.class, ApiModule.class}) +@Component(modules = {AppModule.class, ApiModule.class, DeveloperModule.class}) public interface AppComponent { void inject(ClassSelectionActivity classSelectionActivity); @@ -155,7 +165,7 @@ public interface AppComponent { void inject(NewsFragment newsFragment); - void inject(HabiticaApplication habiticaApplication); + void inject(HabiticaBaseApplication habiticaApplication); void inject(PreferencesFragment preferencesFragment); @@ -184,4 +194,20 @@ public interface AppComponent { void inject(AvatarStatsWidgetProvider avatarStatsWidgetProvider); void inject(SoundManager soundManager); + + void inject(APIHelper apiHelper); + + //void inject(BaseTasksRecyclerViewAdapter vhBaseTasksRecyclerViewAdapter); + + void inject(RemindersManager remindersManager); + + void inject(TaskAlarmManager taskAlarmManager); + + void inject(DailiesRecyclerViewHolder dailiesRecyclerViewHolder); + + void inject(HabitsRecyclerViewAdapter habitsRecyclerViewAdapter); + + void inject(RewardsRecyclerViewAdapter rewardsRecyclerViewAdapter); + + void inject(TodosRecyclerViewAdapter todosRecyclerViewAdapter); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemindersManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemindersManager.java index d360b9465..160e35103 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemindersManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemindersManager.java @@ -1,5 +1,10 @@ package com.habitrpg.android.habitica.helpers; +import com.habitrpg.android.habitica.HabiticaBaseApplication; +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem; + import android.app.Dialog; import android.app.TimePickerDialog; import android.content.Context; @@ -11,21 +16,22 @@ import android.widget.Button; import android.widget.DatePicker; import android.widget.TimePicker; -import com.crashlytics.android.Crashlytics; -import com.habitrpg.android.habitica.R; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem; - import java.text.DateFormat; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.UUID; +import javax.inject.Inject; + public class RemindersManager { private DateFormat dateFormater; + @Inject + CrashlyticsProxy crashlyticsProxy; public RemindersManager(String taskType) { + HabiticaBaseApplication.getComponent().inject(this); if (taskType.equals("todo")) { dateFormater = DateFormat.getDateTimeInstance(); } else { @@ -45,7 +51,7 @@ public class RemindersManager { return item; } catch (ParseException e) { e.printStackTrace(); - Crashlytics.logException(e); + crashlyticsProxy.logException(e); return null; } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.java index 309224625..9bad0f059 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskAlarmManager.java @@ -1,10 +1,11 @@ package com.habitrpg.android.habitica.helpers; -import com.crashlytics.android.Crashlytics; +import com.habitrpg.android.habitica.HabiticaBaseApplication; import com.habitrpg.android.habitica.NotificationPublisher; import com.habitrpg.android.habitica.events.ReminderDeleteEvent; import com.habitrpg.android.habitica.events.TaskDeleteEvent; import com.habitrpg.android.habitica.events.TaskSaveEvent; +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; import com.habitrpg.android.habitica.receivers.TaskReceiver; import com.magicmicky.habitrpgwrapper.lib.models.tasks.RemindersItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; @@ -18,16 +19,16 @@ import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; - import android.content.SharedPreferences; import android.os.Build; import android.support.v7.preference.PreferenceManager; -import android.util.Log; import java.util.Calendar; import java.util.Date; import java.util.List; +import javax.inject.Inject; + import rx.Observable; import rx.schedulers.Schedulers; @@ -42,8 +43,11 @@ public class TaskAlarmManager { private static TaskAlarmManager instance = null; private Context context; private AlarmManager am; + @Inject + CrashlyticsProxy crashlyticsProxy; private TaskAlarmManager(Context context) { + HabiticaBaseApplication.getComponent().inject(this); this.context = context; EventBus.getDefault().register(this); am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); @@ -118,7 +122,7 @@ public class TaskAlarmManager { .queryList())) .doOnNext(this::setAlarmsForTask) .subscribeOn(Schedulers.io()) - .subscribe(task -> {}, Crashlytics::logException); + .subscribe(task -> {},crashlyticsProxy::logException); scheduleDailyReminder(context); SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java index 8fb00425b..b30ae19bb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java @@ -1,16 +1,16 @@ package com.habitrpg.android.habitica.modules; -import android.content.Context; -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.support.v7.preference.PreferenceManager; - -import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.helpers.SoundFileLoader; import com.habitrpg.android.habitica.helpers.SoundManager; import com.habitrpg.android.habitica.helpers.TagsHelper; +import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.support.v7.preference.PreferenceManager; + import javax.inject.Named; import javax.inject.Singleton; @@ -20,9 +20,9 @@ import dagger.Provides; @Module public class AppModule { - private HabiticaApplication application; + private Application application; - public AppModule(HabiticaApplication application) { + public AppModule(Application application) { this.application = application; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.java b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.java new file mode 100644 index 000000000..696fbe2b0 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.java @@ -0,0 +1,21 @@ +package com.habitrpg.android.habitica.modules; + + +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; +import com.habitrpg.android.habitica.proxy.impl.EmptyCrashlyticsProxy; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +//provide proxy class for libraries(to avoid 65k limit) +@Module +public class DeveloperModule { + @Provides + @Singleton + protected CrashlyticsProxy provideCrashlyticsProxy() { + return new EmptyCrashlyticsProxy(); + } + +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/ifce/CrashlyticsProxy.java b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/ifce/CrashlyticsProxy.java new file mode 100644 index 000000000..febfcea1d --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/ifce/CrashlyticsProxy.java @@ -0,0 +1,18 @@ +package com.habitrpg.android.habitica.proxy.ifce; + + +import android.content.Context; + +public interface CrashlyticsProxy { + void init(Context context); + + void logException(Throwable t); + + void setString(String key, String value); + + void setUserIdentifier(String identifier); + + void setUserName(String name); + + void fabricLogE(String s1, String s2, Exception e); +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/impl/EmptyCrashlyticsProxy.java b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/impl/EmptyCrashlyticsProxy.java new file mode 100644 index 000000000..a2dd161a7 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/impl/EmptyCrashlyticsProxy.java @@ -0,0 +1,38 @@ +package com.habitrpg.android.habitica.proxy.impl; + + +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; + +import android.content.Context; + +public class EmptyCrashlyticsProxy implements CrashlyticsProxy { + @Override + public void init(Context context) { + //pass + } + + @Override + public void logException(Throwable e) { + //pass + } + + @Override + public void setString(String key, String value) { + //pass + } + + @Override + public void setUserIdentifier(String identifier) { + //pass + } + + @Override + public void setUserName(String name) { + + } + + @Override + public void fabricLogE(String s1, String s2, Exception e) { + //pass + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index c38b0505c..693200d15 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -1,57 +1,9 @@ package com.habitrpg.android.habitica.ui.activities; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.res.Configuration; -import android.database.sqlite.SQLiteDoneException; -import android.databinding.DataBindingUtil; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.media.AudioAttributes; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.media.SoundPool; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.preference.PreferenceManager; -import android.support.design.widget.TabLayout; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.content.FileProvider; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.Toolbar; -import android.util.Log; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; - -import com.amplitude.api.Amplitude; -import com.crashlytics.android.Crashlytics; import com.habitrpg.android.habitica.APIHelper; -import com.habitrpg.android.habitica.helpers.SoundFile; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HostConfig; -import com.habitrpg.android.habitica.NotificationPublisher; import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.helpers.SoundFileLoader; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.ItemsCallback; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; @@ -72,7 +24,6 @@ import com.habitrpg.android.habitica.events.TaskRemovedEvent; import com.habitrpg.android.habitica.events.TaskSaveEvent; import com.habitrpg.android.habitica.events.ToggledEditTagsEvent; import com.habitrpg.android.habitica.events.ToggledInnStateEvent; -import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand; import com.habitrpg.android.habitica.events.commands.BuyGemItemCommand; import com.habitrpg.android.habitica.events.commands.BuyRewardCommand; import com.habitrpg.android.habitica.events.commands.ChecklistCheckedCommand; @@ -92,11 +43,11 @@ import com.habitrpg.android.habitica.helpers.LanguageHelper; import com.habitrpg.android.habitica.helpers.SoundManager; import com.habitrpg.android.habitica.helpers.TaskAlarmManager; import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; import com.habitrpg.android.habitica.ui.AvatarView; import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; import com.habitrpg.android.habitica.ui.TutorialView; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; -import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment; import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils; import com.habitrpg.android.habitica.ui.helpers.UiUtils; import com.habitrpg.android.habitica.ui.menu.MainDrawerBuilder; @@ -149,8 +100,42 @@ import com.raizlabs.android.dbflow.structure.BaseModel; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; -import org.solovyev.android.checkout.ActivityCheckout; -import org.solovyev.android.checkout.Checkout; + +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.database.sqlite.SQLiteDoneException; +import android.databinding.DataBindingUtil; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.support.design.widget.TabLayout; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.FileProvider; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; import java.io.File; import java.util.ArrayList; @@ -170,7 +155,6 @@ import butterknife.BindView; import retrofit2.adapter.rxjava.HttpException; import rx.Observable; import rx.functions.Action1; -import rx.schedulers.Schedulers; import static com.habitrpg.android.habitica.ui.helpers.UiUtils.SnackbarDisplayType; import static com.habitrpg.android.habitica.ui.helpers.UiUtils.showSnackbar; @@ -193,6 +177,9 @@ public class MainActivity extends BaseActivity implements Action1, Ha protected HostConfig hostConfig; @Inject protected SharedPreferences sharedPreferences; + @Inject + CrashlyticsProxy crashlyticsProxy; + @BindView(R.id.floating_menu_wrapper) FrameLayout floatingMenuWrapper; @BindView(R.id.toolbar) @@ -317,7 +304,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha try { taskAlarmManager.scheduleAllSavedAlarms(); } catch (Exception e) { - Crashlytics.logException(e); + crashlyticsProxy.logException(e); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.java index a932b5c42..16ae6bbfb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.java @@ -1,12 +1,14 @@ package com.habitrpg.android.habitica.ui.adapter.tasks; -import com.crashlytics.android.Crashlytics; +import com.habitrpg.android.habitica.HabiticaBaseApplication; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.TaskCreatedEvent; import com.habitrpg.android.habitica.events.TaskRemovedEvent; import com.habitrpg.android.habitica.events.TaskUpdatedEvent; import com.habitrpg.android.habitica.events.commands.FilterTasksByTagsCommand; import com.habitrpg.android.habitica.events.commands.TaskCheckedCommand; import com.habitrpg.android.habitica.helpers.TagsHelper; +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; import com.habitrpg.android.habitica.ui.viewHolders.tasks.BaseTaskViewHolder; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; @@ -28,12 +30,16 @@ import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public abstract class BaseTasksRecyclerViewAdapter extends RecyclerView.Adapter { + @Inject + protected CrashlyticsProxy crashlyticsProxy; private final String userID; int layoutResource; @@ -51,12 +57,15 @@ public abstract class BaseTasksRecyclerViewAdapter(); + injectThis(HabiticaBaseApplication.getComponent()); this.loadContent(true); this.layoutResource = layoutResource; } + protected abstract void injectThis(AppComponent component); + @Override public void onBindViewHolder(VH holder, int position) { Task item = filteredContent.get(position); @@ -200,7 +209,7 @@ public abstract class BaseTasksRecyclerViewAdapter setTasks(tasks)); + .subscribe(tasks::add, crashlyticsProxy::logException, () -> setTasks(tasks)); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/DailiesRecyclerViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/DailiesRecyclerViewHolder.java index 69a600698..ac10ab171 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/DailiesRecyclerViewHolder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/DailiesRecyclerViewHolder.java @@ -1,5 +1,7 @@ package com.habitrpg.android.habitica.ui.adapter.tasks; +import com.habitrpg.android.habitica.HabiticaBaseApplication; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.helpers.TagsHelper; import com.habitrpg.android.habitica.ui.viewHolders.tasks.DailyViewHolder; @@ -22,6 +24,12 @@ public class DailiesRecyclerViewHolder extends SortableTasksRecyclerViewAdapter< return new DailyViewHolder(getContentView(parent), dailyResetOffset); } + + @Override + protected void injectThis(AppComponent component) { + HabiticaBaseApplication.getComponent().inject(this); + } + @Override public void onBindViewHolder(DailyViewHolder holder, int position) { super.onBindViewHolder(holder, position); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/HabitsRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/HabitsRecyclerViewAdapter.java index e6bbf73eb..25b63e630 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/HabitsRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/HabitsRecyclerViewAdapter.java @@ -1,5 +1,7 @@ package com.habitrpg.android.habitica.ui.adapter.tasks; +import com.habitrpg.android.habitica.HabiticaBaseApplication; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.helpers.TagsHelper; import com.habitrpg.android.habitica.ui.viewHolders.tasks.HabitViewHolder; @@ -17,4 +19,9 @@ public class HabitsRecyclerViewAdapter extends SortableTasksRecyclerViewAdapter< public HabitViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new HabitViewHolder(getContentView(parent)); } + + @Override + protected void injectThis(AppComponent component) { + HabiticaBaseApplication.getComponent().inject(this); + } } \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.java index 5bc335492..9cac5a5ef 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.java @@ -2,7 +2,9 @@ package com.habitrpg.android.habitica.ui.adapter.tasks; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.ContentCache; +import com.habitrpg.android.habitica.HabiticaBaseApplication; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.helpers.TagsHelper; import com.habitrpg.android.habitica.ui.viewHolders.tasks.RewardViewHolder; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -91,6 +93,11 @@ public class RewardsRecyclerViewAdapter extends BaseTasksRecyclerViewAdapter tasks) { super.setTasks(tasks); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TodosRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TodosRecyclerViewAdapter.java index 068e466b1..604be2755 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TodosRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/TodosRecyclerViewAdapter.java @@ -1,5 +1,7 @@ package com.habitrpg.android.habitica.ui.adapter.tasks; +import com.habitrpg.android.habitica.HabiticaBaseApplication; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.helpers.TagsHelper; import com.habitrpg.android.habitica.ui.viewHolders.tasks.TodoViewHolder; @@ -17,4 +19,9 @@ public class TodosRecyclerViewAdapter extends SortableTasksRecyclerViewAdapter priceMap; private static final int GEMS_TO_ADD = 21; @@ -102,7 +103,7 @@ public class GemsPurchaseFragment extends BaseFragment { @Override public void onError(int i, @NonNull Exception e) { - Fabric.getLogger().e("Purchase", "Consume", e); + crashlyticsProxy.fabricLogE("Purchase", "Consume", e); } }); } @@ -110,7 +111,7 @@ public class GemsPurchaseFragment extends BaseFragment { @Override public void onError(int i, @NonNull Exception e) { - Fabric.getLogger().e("Purchase", "Error", e); + crashlyticsProxy.fabricLogE("Purchase", "Error", e); } }); @@ -179,7 +180,7 @@ public class GemsPurchaseFragment extends BaseFragment { @Override public void onError(int i, @NonNull Exception e) { - Fabric.getLogger().e("Purchase", "Consume", e); + crashlyticsProxy.fabricLogE("Purchase", "Consume", e); } }); } @@ -188,7 +189,7 @@ public class GemsPurchaseFragment extends BaseFragment { @Override public void onError(int i, @NonNull Exception e) { - Fabric.getLogger().e("Purchase", "getAllPurchases", e); + crashlyticsProxy.fabricLogE("Purchase", "getAllPurchases", e); } }); } @@ -209,7 +210,7 @@ public class GemsPurchaseFragment extends BaseFragment { @Override public void onError(int i, @NonNull Exception e) { - Fabric.getLogger().e("Purchase", "Error", e); + crashlyticsProxy.fabricLogE("Purchase", "Error", e); } }); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java index 865a0782f..9aca07b77 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.widget; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.HabiticaBaseApplication; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.AvatarView; @@ -13,7 +14,6 @@ import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; -import android.annotation.TargetApi; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.content.ComponentName; @@ -42,7 +42,7 @@ public class AvatarStatsWidgetProvider extends BaseWidgetProvider { private void setUp(Context context) { if (apiHelper == null) { - HabiticaApplication application = HabiticaApplication.getInstance(context); + HabiticaBaseApplication application = HabiticaApplication.getInstance(context); application.getComponent().inject(this); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java index c486a3bf7..a3d1e16fd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java @@ -12,6 +12,7 @@ import android.widget.RemoteViews; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.HabiticaBaseApplication; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; @@ -32,7 +33,7 @@ public class DailiesWidgetProvider extends BaseWidgetProvider { private void setUp(Context context) { if (apiHelper == null) { - HabiticaApplication application = HabiticaApplication.getInstance(context); + HabiticaBaseApplication application = HabiticaApplication.getInstance(context); application.getComponent().inject(this); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.java index e1c5a66d5..30f745b2f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.java @@ -11,6 +11,7 @@ import android.widget.Toast; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.HabiticaBaseApplication; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.helpers.UiUtils; @@ -38,7 +39,7 @@ public class HabitButtonWidgetProvider extends BaseWidgetProvider { private void setUp(Context context) { if (apiHelper == null) { - HabiticaApplication application = HabiticaApplication.getInstance(context); + HabiticaBaseApplication application = HabiticaApplication.getInstance(context); application.getComponent().inject(this); } } diff --git a/Habitica/src/release/java/com/habitrpg/android/habitica/HabiticaApplication.java b/Habitica/src/release/java/com/habitrpg/android/habitica/HabiticaApplication.java new file mode 100644 index 000000000..0d9f5117a --- /dev/null +++ b/Habitica/src/release/java/com/habitrpg/android/habitica/HabiticaApplication.java @@ -0,0 +1,18 @@ +package com.habitrpg.android.habitica; + +import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.components.DaggerAppComponent; +import com.habitrpg.android.habitica.modules.AppModule; + +import android.content.Context; + +public class HabiticaApplication extends HabiticaBaseApplication { + @Override + protected AppComponent initDagger() { + return DaggerAppComponent.builder() + .appModule(new AppModule(this)) + .developerModule(new ReleaseDeveloperModule()) + .build(); + } + +} diff --git a/Habitica/src/release/java/com/habitrpg/android/habitica/ReleaseDeveloperModule.java b/Habitica/src/release/java/com/habitrpg/android/habitica/ReleaseDeveloperModule.java new file mode 100644 index 000000000..6aceb0af2 --- /dev/null +++ b/Habitica/src/release/java/com/habitrpg/android/habitica/ReleaseDeveloperModule.java @@ -0,0 +1,9 @@ +package com.habitrpg.android.habitica; + + +import com.habitrpg.android.habitica.modules.DeveloperModule; + +//change debug proxy here by override methods +public class ReleaseDeveloperModule extends DeveloperModule { + +} diff --git a/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java b/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java new file mode 100644 index 000000000..02f5574d0 --- /dev/null +++ b/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java @@ -0,0 +1,47 @@ +package com.habitrpg.android.habitica.proxy; + + +import com.crashlytics.android.Crashlytics; +import com.crashlytics.android.core.CrashlyticsCore; +import com.habitrpg.android.habitica.BuildConfig; +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; + +import android.content.Context; + +import io.fabric.sdk.android.Fabric; + +public class CrashlyticsProxyImpl implements CrashlyticsProxy { + @Override + public void init(Context context) { + Crashlytics crashlytics = new Crashlytics.Builder() + .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) + .build(); + Fabric.with(context, crashlytics); + } + + + @Override + public void logException(Throwable t) { + Crashlytics.logException(t); + } + + @Override + public void setString(String key, String value) { + Crashlytics.setString(key, value); + } + + @Override + public void setUserIdentifier(String identifier) { + Crashlytics.getInstance().core.setUserIdentifier(identifier); + } + + @Override + public void setUserName(String name) { + Crashlytics.getInstance().core.setUserName(name); + } + + @Override + public void fabricLogE(String s1, String s2, Exception e) { + Fabric.getLogger().e(s1,s2,e); + } +} From 43bce4649d03b524ae2f8b3bc09a4fca069797e9 Mon Sep 17 00:00:00 2001 From: d954mas Date: Thu, 17 Nov 2016 15:59:03 +0300 Subject: [PATCH 04/34] update/remove libs --- Habitica/AndroidManifest.xml | 1 - Habitica/build.gradle | 22 +++++++++------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 68e82b5d1..17371d259 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -129,7 +129,6 @@ android:configChanges= "keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:screenOrientation="portrait" - android:theme="@android:style/Theme.Translucent.NoTitleBar" android:label="@string/app_name" /> apply plugin: 'com.getkeepsafe.dexcount' apply plugin: 'com.android.application' //or apply plugin: 'java' apply plugin: 'me.tatarka.retrolambda' -apply plugin: 'com.jakewharton.hugo' apply plugin: 'com.google.gms.google-services' From 51aca742f43f8440c0f7c0ea8b867bb822e3db79 Mon Sep 17 00:00:00 2001 From: Negue Date: Thu, 17 Nov 2016 22:36:28 +0100 Subject: [PATCH 05/34] markdown / emoji support in widgets --- .../habitica/widget/DailiesListProvider.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java index e1c035133..3123002e5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java @@ -3,14 +3,21 @@ package com.habitrpg.android.habitica.widget; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; +import android.content.res.TypedArray; +import android.text.SpannableStringBuilder; +import android.text.style.DynamicDrawableSpan; import android.widget.RemoteViews; import android.widget.RemoteViewsService; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.raizlabs.android.dbflow.sql.builder.Condition; +import com.raizlabs.android.dbflow.sql.language.OrderBy; import com.raizlabs.android.dbflow.sql.language.Select; +import net.pherth.android.emoji_library.EmojiHandler; + import java.util.ArrayList; import java.util.List; @@ -36,6 +43,7 @@ public class DailiesListProvider implements RemoteViewsService.RemoteViewsFactor .from(Task.class) .where(Condition.column("type").eq(Task.TYPE_DAILY)) .and(Condition.column("completed").eq(false)) + .orderBy(OrderBy.columns("position", "dateCreated").descending()) .queryList())) .filter(task -> task.isDisplayedActive(0)) .toList() @@ -78,7 +86,13 @@ public class DailiesListProvider implements RemoteViewsService.RemoteViewsFactor context.getPackageName(), R.layout.widget_dailies_list_row); if (taskList.size() > position) { Task task = taskList.get(position); - remoteView.setTextViewText(R.id.dailies_text, task.text); + + CharSequence parsedText = MarkdownParser.parseMarkdown(task.text); + + SpannableStringBuilder builder = new SpannableStringBuilder(parsedText); + EmojiHandler.addEmojis(this.context, builder, 16, DynamicDrawableSpan.ALIGN_BASELINE, 16, 0, -1, false); + + remoteView.setTextViewText(R.id.dailies_text, builder); remoteView.setInt(R.id.checkbox_background, "setBackgroundResource", task.getLightTaskColor()); Intent fillInIntent = new Intent(); fillInIntent.putExtra(DailiesWidgetProvider.TASK_ID_ITEM, task.getId()); From d69895279f4b406d5a03102a1ac44eafb0faef50 Mon Sep 17 00:00:00 2001 From: Negue Date: Thu, 17 Nov 2016 22:55:30 +0100 Subject: [PATCH 06/34] activity to choose task type before adding the widget --- Habitica/AndroidManifest.xml | 9 +- .../res/layout/widget_configure_task_list.xml | 7 + .../widget_configure_task_list_item.xml | 21 +++ Habitica/res/values/strings.xml | 2 +- ...get_info.xml => task_list_widget_info.xml} | 3 +- .../habitica/components/AppComponent.java | 3 + .../activities/HabitButtonWidgetActivity.java | 3 - .../ui/activities/TaskListWidgetActivity.java | 164 ++++++++++++++++++ 8 files changed, 205 insertions(+), 7 deletions(-) create mode 100644 Habitica/res/layout/widget_configure_task_list.xml create mode 100644 Habitica/res/layout/widget_configure_task_list_item.xml rename Habitica/res/xml/{dailies_task_widget_info.xml => task_list_widget_info.xml} (68%) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskListWidgetActivity.java diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 68e82b5d1..465a4ae4a 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -166,6 +166,11 @@ + + + + + @@ -199,12 +204,12 @@ android:resource="@xml/avatar_widget_info" /> + android:label="@string/widget_task_list"> + android:resource="@xml/task_list_widget_info" /> diff --git a/Habitica/res/layout/widget_configure_task_list.xml b/Habitica/res/layout/widget_configure_task_list.xml new file mode 100644 index 000000000..52a5f6d8e --- /dev/null +++ b/Habitica/res/layout/widget_configure_task_list.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/Habitica/res/layout/widget_configure_task_list_item.xml b/Habitica/res/layout/widget_configure_task_list_item.xml new file mode 100644 index 000000000..2de284224 --- /dev/null +++ b/Habitica/res/layout/widget_configure_task_list_item.xml @@ -0,0 +1,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index b8851355b..32c9b402c 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -416,7 +416,7 @@ To start, which parts of your life do you want to improve? Add Reward You completed all your dailies. Well done! Habitica Do Habit - Habitica Dailies + Habitica Task List Habitica Add Task Google play services could not be found. Purchase diff --git a/Habitica/res/xml/dailies_task_widget_info.xml b/Habitica/res/xml/task_list_widget_info.xml similarity index 68% rename from Habitica/res/xml/dailies_task_widget_info.xml rename to Habitica/res/xml/task_list_widget_info.xml index db0b85187..ba50c211a 100644 --- a/Habitica/res/xml/dailies_task_widget_info.xml +++ b/Habitica/res/xml/task_list_widget_info.xml @@ -4,6 +4,7 @@ android:minHeight="120dp" android:minWidth="120dp" android:updatePeriodMillis="1800000" - android:resizeMode="horizontal|vertical"> + android:resizeMode="horizontal|vertical" + android:configure="com.habitrpg.android.habitica.ui.activities.TaskListWidgetActivity"> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 5c228a15b..f40aa70f7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -21,6 +21,7 @@ import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.activities.SkillMemberActivity; import com.habitrpg.android.habitica.ui.activities.SkillTasksActivity; import com.habitrpg.android.habitica.ui.activities.TaskFormActivity; +import com.habitrpg.android.habitica.ui.activities.TaskListWidgetActivity; import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment; import com.habitrpg.android.habitica.ui.fragments.NewsFragment; import com.habitrpg.android.habitica.ui.fragments.faq.FAQDetailFragment; @@ -184,4 +185,6 @@ public interface AppComponent { void inject(AvatarStatsWidgetProvider avatarStatsWidgetProvider); void inject(SoundManager soundManager); + + void inject(TaskListWidgetActivity taskListWidgetActivity); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.java index aa9e15aa2..bfc3b86d1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.java @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.activities; -import android.app.Activity; import android.appwidget.AppWidgetManager; import android.content.Intent; import android.content.SharedPreferences; @@ -12,7 +11,6 @@ import android.support.v7.widget.RecyclerView; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.adapter.SkillTasksRecyclerViewAdapter; -import com.habitrpg.android.habitica.widget.AddTaskWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; @@ -38,7 +36,6 @@ public class HabitButtonWidgetActivity extends BaseActivity implements TaskClick @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ButterKnife.bind(this); Intent intent = getIntent(); Bundle extras = intent.getExtras(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskListWidgetActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskListWidgetActivity.java new file mode 100644 index 000000000..38bc88165 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskListWidgetActivity.java @@ -0,0 +1,164 @@ +package com.habitrpg.android.habitica.ui.activities; + +import android.appwidget.AppWidgetManager; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v7.preference.PreferenceManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; + +import java.util.ArrayList; +import java.util.HashMap; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class TaskListWidgetActivity extends BaseActivity implements TaskTypeSelected { + + @BindView(R.id.recyclerView) + RecyclerView recyclerView; + private int widgetId; + + @Override + protected int getLayoutResId() { + return R.layout.widget_configure_task_list; + } + + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = getIntent(); + Bundle extras = intent.getExtras(); + if (extras != null) { + widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + } + + // If this activity was started with an intent without an app widget ID, + // finish with an error. + if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { + finish(); + } + + LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); + + if (layoutManager == null) { + layoutManager = new LinearLayoutManager(this); + + recyclerView.setLayoutManager(layoutManager); + } + + HashMap taskTypesMap = new HashMap<>(); + taskTypesMap.put(getString(R.string.dailies),"dailies"); + taskTypesMap.put(getString(R.string.todos),"todos"); + + recyclerView.setAdapter(new TaskTypeSelectionViewAdapter(taskTypesMap, this)); + } + + @Override + public void taskTypeSelected(String selectedType) { + finishWithSelection(selectedType); + } + + + + public class TaskTypeSelectionViewAdapter extends RecyclerView.Adapter + { + private HashMap taskTypes; + private TaskTypeSelected taskTypeSelected; + + public TaskTypeSelectionViewAdapter(HashMap taskTypes, TaskTypeSelected taskTypeSelected) { + + this.taskTypes = taskTypes; + this.taskTypeSelected = taskTypeSelected; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.widget_configure_task_list_item, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + ArrayList keys = new ArrayList<>(taskTypes.keySet()); + + String label = keys.get(position); + String value = taskTypes.get(label); + + holder.bind(label, value); + } + + @Override + public int getItemCount() { + return taskTypes.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + @BindView(R.id.text) + TextView textView; + + public ViewHolder(View itemView) { + super(itemView); + + itemView.setOnClickListener(this); + itemView.setClickable(true); + + ButterKnife.bind(this, itemView); + } + + private String key; + + public void bind(String label, String key){ + textView.setText(label); + this.key = key; + } + + @Override + public void onClick(View view) { + taskTypeSelected.taskTypeSelected(key); + } + } + } + + private void finishWithSelection(String selectedTaskType) { + storeSelectedTaskType(selectedTaskType); + + Intent resultValue = new Intent(); + resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); + setResult(RESULT_OK, resultValue); + finish(); + + Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, HabitButtonWidgetProvider.class); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {widgetId}); + sendBroadcast(intent); + } + + private void storeSelectedTaskType(String selectedTaskType) { + SharedPreferences.Editor preferences = PreferenceManager.getDefaultSharedPreferences(this).edit(); + preferences.putString("habit_list_widget_" + widgetId, selectedTaskType); + preferences.apply(); + } +} + +interface TaskTypeSelected +{ + void taskTypeSelected(String selectedType); +} + From 5a59f4451d9021d0f694785c77974cf45f6beacf Mon Sep 17 00:00:00 2001 From: Negue Date: Fri, 18 Nov 2016 22:16:45 +0100 Subject: [PATCH 07/34] revert from settings activity - split widgets into separate classes / providers --- Habitica/AndroidManifest.xml | 19 +- .../res/layout/widget_configure_task_list.xml | 7 - .../widget_configure_task_list_item.xml | 21 --- Habitica/res/values/strings.xml | 3 +- Habitica/res/xml/task_list_widget_info.xml | 3 +- .../habitica/components/AppComponent.java | 4 +- .../ui/activities/TaskListWidgetActivity.java | 164 ------------------ .../habitica/widget/DailiesListProvider.java | 122 +------------ .../widget/DailiesWidgetProvider.java | 111 +----------- .../habitica/widget/DailiesWidgetService.java | 1 + .../habitica/widget/TaskListProvider.java | 129 ++++++++++++++ .../widget/TaskListWidgetProvider.java | 125 +++++++++++++ .../habitica/widget/TodoListProvider.java | 12 ++ .../widget/TodoListWidgetProvider.java | 9 + .../habitica/widget/TodosWidgetService.java | 12 ++ 15 files changed, 312 insertions(+), 430 deletions(-) delete mode 100644 Habitica/res/layout/widget_configure_task_list.xml delete mode 100644 Habitica/res/layout/widget_configure_task_list_item.xml delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskListWidgetActivity.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListProvider.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListProvider.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.java diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 465a4ae4a..00a950c73 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -166,12 +166,6 @@ - - - - - - @@ -204,7 +198,15 @@ android:resource="@xml/avatar_widget_info" /> + android:label="@string/widget_dailies"> + + + + + + @@ -223,6 +225,9 @@ + diff --git a/Habitica/res/layout/widget_configure_task_list.xml b/Habitica/res/layout/widget_configure_task_list.xml deleted file mode 100644 index 52a5f6d8e..000000000 --- a/Habitica/res/layout/widget_configure_task_list.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/Habitica/res/layout/widget_configure_task_list_item.xml b/Habitica/res/layout/widget_configure_task_list_item.xml deleted file mode 100644 index 2de284224..000000000 --- a/Habitica/res/layout/widget_configure_task_list_item.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 32c9b402c..8bbe7d42e 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -416,7 +416,8 @@ To start, which parts of your life do you want to improve? Add Reward You completed all your dailies. Well done! Habitica Do Habit - Habitica Task List + Habitica Dailies + Habitica Todo List Habitica Add Task Google play services could not be found. Purchase diff --git a/Habitica/res/xml/task_list_widget_info.xml b/Habitica/res/xml/task_list_widget_info.xml index ba50c211a..db0b85187 100644 --- a/Habitica/res/xml/task_list_widget_info.xml +++ b/Habitica/res/xml/task_list_widget_info.xml @@ -4,7 +4,6 @@ android:minHeight="120dp" android:minWidth="120dp" android:updatePeriodMillis="1800000" - android:resizeMode="horizontal|vertical" - android:configure="com.habitrpg.android.habitica.ui.activities.TaskListWidgetActivity"> + android:resizeMode="horizontal|vertical"> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index f40aa70f7..e819a04da 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -21,7 +21,6 @@ import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.activities.SkillMemberActivity; import com.habitrpg.android.habitica.ui.activities.SkillTasksActivity; import com.habitrpg.android.habitica.ui.activities.TaskFormActivity; -import com.habitrpg.android.habitica.ui.activities.TaskListWidgetActivity; import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment; import com.habitrpg.android.habitica.ui.fragments.NewsFragment; import com.habitrpg.android.habitica.ui.fragments.faq.FAQDetailFragment; @@ -61,6 +60,7 @@ import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider; import com.habitrpg.android.habitica.widget.DailiesWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetService; +import com.habitrpg.android.habitica.widget.TaskListWidgetProvider; import javax.inject.Singleton; @@ -186,5 +186,5 @@ public interface AppComponent { void inject(SoundManager soundManager); - void inject(TaskListWidgetActivity taskListWidgetActivity); + void inject(TaskListWidgetProvider taskListWidgetProvider); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskListWidgetActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskListWidgetActivity.java deleted file mode 100644 index 38bc88165..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskListWidgetActivity.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.habitrpg.android.habitica.ui.activities; - -import android.appwidget.AppWidgetManager; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.support.v7.preference.PreferenceManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.components.AppComponent; -import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; - -import java.util.ArrayList; -import java.util.HashMap; - -import butterknife.BindView; -import butterknife.ButterKnife; - -public class TaskListWidgetActivity extends BaseActivity implements TaskTypeSelected { - - @BindView(R.id.recyclerView) - RecyclerView recyclerView; - private int widgetId; - - @Override - protected int getLayoutResId() { - return R.layout.widget_configure_task_list; - } - - @Override - protected void injectActivity(AppComponent component) { - component.inject(this); - } - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent intent = getIntent(); - Bundle extras = intent.getExtras(); - if (extras != null) { - widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - } - - // If this activity was started with an intent without an app widget ID, - // finish with an error. - if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { - finish(); - } - - LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); - - if (layoutManager == null) { - layoutManager = new LinearLayoutManager(this); - - recyclerView.setLayoutManager(layoutManager); - } - - HashMap taskTypesMap = new HashMap<>(); - taskTypesMap.put(getString(R.string.dailies),"dailies"); - taskTypesMap.put(getString(R.string.todos),"todos"); - - recyclerView.setAdapter(new TaskTypeSelectionViewAdapter(taskTypesMap, this)); - } - - @Override - public void taskTypeSelected(String selectedType) { - finishWithSelection(selectedType); - } - - - - public class TaskTypeSelectionViewAdapter extends RecyclerView.Adapter - { - private HashMap taskTypes; - private TaskTypeSelected taskTypeSelected; - - public TaskTypeSelectionViewAdapter(HashMap taskTypes, TaskTypeSelected taskTypeSelected) { - - this.taskTypes = taskTypes; - this.taskTypeSelected = taskTypeSelected; - } - - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.widget_configure_task_list_item, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(ViewHolder holder, int position) { - ArrayList keys = new ArrayList<>(taskTypes.keySet()); - - String label = keys.get(position); - String value = taskTypes.get(label); - - holder.bind(label, value); - } - - @Override - public int getItemCount() { - return taskTypes.size(); - } - - public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - @BindView(R.id.text) - TextView textView; - - public ViewHolder(View itemView) { - super(itemView); - - itemView.setOnClickListener(this); - itemView.setClickable(true); - - ButterKnife.bind(this, itemView); - } - - private String key; - - public void bind(String label, String key){ - textView.setText(label); - this.key = key; - } - - @Override - public void onClick(View view) { - taskTypeSelected.taskTypeSelected(key); - } - } - } - - private void finishWithSelection(String selectedTaskType) { - storeSelectedTaskType(selectedTaskType); - - Intent resultValue = new Intent(); - resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); - setResult(RESULT_OK, resultValue); - finish(); - - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, HabitButtonWidgetProvider.class); - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {widgetId}); - sendBroadcast(intent); - } - - private void storeSelectedTaskType(String selectedTaskType) { - SharedPreferences.Editor preferences = PreferenceManager.getDefaultSharedPreferences(this).edit(); - preferences.putString("habit_list_widget_" + widgetId, selectedTaskType); - preferences.apply(); - } -} - -interface TaskTypeSelected -{ - void taskTypeSelected(String selectedType); -} - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java index 3123002e5..44bbde43d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java @@ -1,129 +1,13 @@ package com.habitrpg.android.habitica.widget; -import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; -import android.content.res.TypedArray; -import android.text.SpannableStringBuilder; -import android.text.style.DynamicDrawableSpan; -import android.widget.RemoteViews; -import android.widget.RemoteViewsService; -import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; -import com.raizlabs.android.dbflow.sql.builder.Condition; -import com.raizlabs.android.dbflow.sql.language.OrderBy; -import com.raizlabs.android.dbflow.sql.language.Select; - -import net.pherth.android.emoji_library.EmojiHandler; - -import java.util.ArrayList; -import java.util.List; - -import rx.Observable; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; - -public class DailiesListProvider implements RemoteViewsService.RemoteViewsFactory { - private final int widgetId; - private List taskList = new ArrayList<>(); - private Context context = null; - private boolean reloadData; +public class DailiesListProvider extends TaskListProvider { public DailiesListProvider(Context context, Intent intent) { - this.context = context; - this.widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); - this.reloadData = false; - this.loadData(); + super(context, intent, Task.TYPE_DAILY); } +} - private void loadData() { - Observable.defer(() -> Observable.from(new Select() - .from(Task.class) - .where(Condition.column("type").eq(Task.TYPE_DAILY)) - .and(Condition.column("completed").eq(false)) - .orderBy(OrderBy.columns("position", "dateCreated").descending()) - .queryList())) - .filter(task -> task.isDisplayedActive(0)) - .toList() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(tasks -> { - taskList = tasks; - this.reloadData = false; - AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(widgetId, R.id.list_view); - }, throwable -> { - this.reloadData = false; - }); - } - - - @Override - public void onCreate() { - } - - @Override - public void onDataSetChanged() { - if (this.reloadData) { - this.loadData(); - } - this.reloadData = true; - } - - @Override - public void onDestroy() { - } - - @Override - public int getCount() { - return taskList.size(); - } - - @Override - public RemoteViews getViewAt(int position) { - final RemoteViews remoteView = new RemoteViews( - context.getPackageName(), R.layout.widget_dailies_list_row); - if (taskList.size() > position) { - Task task = taskList.get(position); - - CharSequence parsedText = MarkdownParser.parseMarkdown(task.text); - - SpannableStringBuilder builder = new SpannableStringBuilder(parsedText); - EmojiHandler.addEmojis(this.context, builder, 16, DynamicDrawableSpan.ALIGN_BASELINE, 16, 0, -1, false); - - remoteView.setTextViewText(R.id.dailies_text, builder); - remoteView.setInt(R.id.checkbox_background, "setBackgroundResource", task.getLightTaskColor()); - Intent fillInIntent = new Intent(); - fillInIntent.putExtra(DailiesWidgetProvider.TASK_ID_ITEM, task.getId()); - remoteView.setOnClickFillInIntent(R.id.dailies_list_row, fillInIntent); - } - return remoteView; - } - - @Override - public RemoteViews getLoadingView() { - return new RemoteViews( - context.getPackageName(), R.layout.widget_dailies_list_row); - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public long getItemId(int position) { - if (taskList.size() > position) { - Task task = taskList.get(position); - return task.getId().hashCode(); - } - return position; - } - - @Override - public boolean hasStableIds() { - return true; - } - -} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java index c486a3bf7..3f416ea9c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java @@ -1,113 +1,10 @@ package com.habitrpg.android.habitica.widget; -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.widget.RemoteViews; - -import com.habitrpg.android.habitica.APIHelper; -import com.habitrpg.android.habitica.HabiticaApplication; -import com.habitrpg.android.habitica.HostConfig; -import com.habitrpg.android.habitica.R; -import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; -import com.raizlabs.android.dbflow.sql.builder.Condition; -import com.raizlabs.android.dbflow.sql.language.Select; - -import javax.inject.Inject; - -public class DailiesWidgetProvider extends BaseWidgetProvider { - public static final String DAILY_ACTION = "com.habitrpg.android.habitica.DAILY_ACTION"; - public static final String TASK_ID_ITEM = "com.habitrpg.android.habitica.TASK_ID_ITEM"; - - @Inject - APIHelper apiHelper; - @Inject - HostConfig hostConfig; - - private void setUp(Context context) { - if (apiHelper == null) { - HabiticaApplication application = HabiticaApplication.getInstance(context); - application.getComponent().inject(this); - } - } +public class DailiesWidgetProvider extends TaskListWidgetProvider{ @Override - public void onReceive(Context context, Intent intent) { - setUp(context); - if (intent.getAction().equals(DAILY_ACTION)) { - AppWidgetManager mgr = AppWidgetManager.getInstance(context); - int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID); - String taskId = intent.getStringExtra(TASK_ID_ITEM); - - if (taskId != null) { - apiHelper.apiService.postTaskDirection(taskId, TaskDirection.up.toString()) - .compose(apiHelper.configureApiCallObserver()) - .subscribe(taskDirectionData -> { - Task task = new Select().from(Task.class).where(Condition.column("id").eq(taskId)).querySingle(); - task.completed = true; - task.save(); - showToastForTaskDirection(context, taskDirectionData, hostConfig.getUser()); - AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); - }, throwable -> { - AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); - }); - } - } - super.onReceive(context, intent); + protected Class getServiceClass() { + return DailiesWidgetService.class; } +} - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - setUp(context); - ComponentName thisWidget = new ComponentName(context, - DailiesWidgetProvider.class); - int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); - - if (Build.VERSION.SDK_INT >= 16) { - for (int widgetId : allWidgetIds) { - Bundle options = appWidgetManager.getAppWidgetOptions(widgetId); - appWidgetManager.partiallyUpdateAppWidget(widgetId, - sizeRemoteViews(context, options, widgetId)); - } - } - - for (int i = 0; i < appWidgetIds.length; ++i) { - Intent intent = new Intent(context, DailiesWidgetService.class); - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); - intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); - RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_dailies); - rv.setRemoteAdapter(appWidgetIds[i], R.id.list_view, intent); - rv.setEmptyView(R.id.list, R.id.empty_view); - - Intent taskIntent = new Intent(context, DailiesWidgetProvider.class); - taskIntent.setAction(DAILY_ACTION); - taskIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); - intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); - PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, taskIntent, - PendingIntent.FLAG_UPDATE_CURRENT); - rv.setPendingIntentTemplate(R.id.list_view, toastPendingIntent); - - appWidgetManager.updateAppWidget(appWidgetIds[i], rv); - - AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.list_view); - } - super.onUpdate(context, appWidgetManager, appWidgetIds); - } - - @Override - public int layoutResourceId() { - return R.layout.widget_dailies; - } - - @Override - public RemoteViews configureRemoteViews(RemoteViews remoteViews, int widgetId, int columns, int rows) { - return remoteViews; - } -} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java index 03f081f5f..094448126 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java @@ -10,3 +10,4 @@ public class DailiesWidgetService extends RemoteViewsService { return new DailiesListProvider(this.getApplicationContext(), intent); } } + diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListProvider.java new file mode 100644 index 000000000..8bc17e635 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListProvider.java @@ -0,0 +1,129 @@ +package com.habitrpg.android.habitica.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Context; +import android.content.Intent; +import android.text.SpannableStringBuilder; +import android.text.style.DynamicDrawableSpan; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import com.raizlabs.android.dbflow.sql.builder.Condition; +import com.raizlabs.android.dbflow.sql.language.OrderBy; +import com.raizlabs.android.dbflow.sql.language.Select; + +import net.pherth.android.emoji_library.EmojiHandler; + +import java.util.ArrayList; +import java.util.List; + +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public abstract class TaskListProvider implements RemoteViewsService.RemoteViewsFactory { + private final int widgetId; + private String taskType; + private List taskList = new ArrayList<>(); + private Context context = null; + private boolean reloadData; + + public TaskListProvider(Context context, Intent intent, String taskType) { + this.context = context; + this.widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); + this.reloadData = false; + this.taskType = taskType; + + this.loadData(); + } + + private void loadData() { + Observable.defer(() -> Observable.from(new Select() + .from(Task.class) + .where(Condition.column("type").eq(taskType)) + .and(Condition.column("completed").eq(false)) + .orderBy(OrderBy.columns("position", "dateCreated").descending()) + .queryList())) + .filter(task -> task.type.equals(Task.TYPE_TODO) || task.isDisplayedActive(0)) + .toList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(tasks -> { + taskList = tasks; + this.reloadData = false; + AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(widgetId, R.id.list_view); + }, throwable -> { + this.reloadData = false; + }); + } + + + @Override + public void onCreate() { + } + + @Override + public void onDataSetChanged() { + if (this.reloadData) { + this.loadData(); + } + this.reloadData = true; + } + + @Override + public void onDestroy() { + } + + @Override + public int getCount() { + return taskList.size(); + } + + @Override + public RemoteViews getViewAt(int position) { + final RemoteViews remoteView = new RemoteViews( + context.getPackageName(), R.layout.widget_dailies_list_row); + if (taskList.size() > position) { + Task task = taskList.get(position); + + CharSequence parsedText = MarkdownParser.parseMarkdown(task.text); + + SpannableStringBuilder builder = new SpannableStringBuilder(parsedText); + EmojiHandler.addEmojis(this.context, builder, 16, DynamicDrawableSpan.ALIGN_BASELINE, 16, 0, -1, false); + + remoteView.setTextViewText(R.id.dailies_text, builder); + remoteView.setInt(R.id.checkbox_background, "setBackgroundResource", task.getLightTaskColor()); + Intent fillInIntent = new Intent(); + fillInIntent.putExtra(TaskListWidgetProvider.TASK_ID_ITEM, task.getId()); + remoteView.setOnClickFillInIntent(R.id.dailies_list_row, fillInIntent); + } + return remoteView; + } + + @Override + public RemoteViews getLoadingView() { + return new RemoteViews(context.getPackageName(), R.layout.widget_dailies_list_row); + } + + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public long getItemId(int position) { + if (taskList.size() > position) { + Task task = taskList.get(position); + return task.getId().hashCode(); + } + return position; + } + + @Override + public boolean hasStableIds() { + return true; + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java new file mode 100644 index 000000000..98a84ee5c --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java @@ -0,0 +1,125 @@ +package com.habitrpg.android.habitica.widget; + +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.widget.RemoteViews; + +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.HostConfig; +import com.habitrpg.android.habitica.R; +import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import com.raizlabs.android.dbflow.sql.builder.Condition; +import com.raizlabs.android.dbflow.sql.language.Select; + +import javax.inject.Inject; + +public abstract class TaskListWidgetProvider extends BaseWidgetProvider { + public static final String DAILY_ACTION = "com.habitrpg.android.habitica.DAILY_ACTION"; + public static final String TASK_ID_ITEM = "com.habitrpg.android.habitica.TASK_ID_ITEM"; + + @Inject + APIHelper apiHelper; + @Inject + HostConfig hostConfig; + @Inject + public SharedPreferences sharedPreferences; + + private void setUp(Context context) { + if (apiHelper == null) { + HabiticaApplication application = HabiticaApplication.getInstance(context); + application.getComponent().inject(this); + } + } + + protected abstract Class getServiceClass(); + + + @Override + public void onReceive(Context context, Intent intent) { + setUp(context); + if (intent.getAction().equals(DAILY_ACTION)) { + AppWidgetManager mgr = AppWidgetManager.getInstance(context); + int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID); + String taskId = intent.getStringExtra(TASK_ID_ITEM); + + if (taskId != null) { + apiHelper.apiService.postTaskDirection(taskId, TaskDirection.up.toString()) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(taskDirectionData -> { + Task task = new Select().from(Task.class).where(Condition.column("id").eq(taskId)).querySingle(); + task.completed = true; + task.save(); + showToastForTaskDirection(context, taskDirectionData, hostConfig.getUser()); + AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); + }, throwable -> { + AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); + }); + } + } + super.onReceive(context, intent); + } + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + setUp(context); + ComponentName thisWidget = new ComponentName(context, + DailiesWidgetProvider.class); + int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + + if (Build.VERSION.SDK_INT >= 16) { + for (int widgetId : allWidgetIds) { + Bundle options = appWidgetManager.getAppWidgetOptions(widgetId); + appWidgetManager.partiallyUpdateAppWidget(widgetId, + sizeRemoteViews(context, options, widgetId)); + } + } + + for (int i = 0; i < appWidgetIds.length; ++i) { + Intent intent = new Intent(context, getServiceClass()); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); + intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); + RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_dailies); + rv.setRemoteAdapter(appWidgetIds[i], R.id.list_view, intent); + rv.setEmptyView(R.id.list, R.id.empty_view); + + Intent taskIntent = new Intent(context, DailiesWidgetProvider.class); + taskIntent.setAction(DAILY_ACTION); + taskIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); + intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); + PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, taskIntent, + PendingIntent.FLAG_UPDATE_CURRENT); + rv.setPendingIntentTemplate(R.id.list_view, toastPendingIntent); + + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + + AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.list_view); + } + + super.onUpdate(context, appWidgetManager, appWidgetIds); + } + + @Override + public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { + super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); + } + + @Override + public int layoutResourceId() { + return R.layout.widget_dailies; + } + + @Override + public RemoteViews configureRemoteViews(RemoteViews remoteViews, int widgetId, int columns, int rows) { + return remoteViews; + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListProvider.java new file mode 100644 index 000000000..0f24c7edc --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListProvider.java @@ -0,0 +1,12 @@ +package com.habitrpg.android.habitica.widget; + +import android.content.Context; +import android.content.Intent; + +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; + +public class TodoListProvider extends TaskListProvider { + public TodoListProvider(Context context, Intent intent) { + super(context, intent, Task.TYPE_TODO); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java new file mode 100644 index 000000000..185a14da0 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java @@ -0,0 +1,9 @@ +package com.habitrpg.android.habitica.widget; + +public class TodoListWidgetProvider extends TaskListWidgetProvider{ + + @Override + protected Class getServiceClass() { + return TodosWidgetService.class; + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.java new file mode 100644 index 000000000..e84a6a5db --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.java @@ -0,0 +1,12 @@ +package com.habitrpg.android.habitica.widget; + +import android.content.Intent; +import android.widget.RemoteViewsService; + +public class TodosWidgetService extends RemoteViewsService { + + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + return new TodoListProvider(this.getApplicationContext(), intent); + } +} From 57867549a2ba4f0f7db6b1ef981680ac3a0413c2 Mon Sep 17 00:00:00 2001 From: AlbrechtRoehm Date: Sat, 19 Nov 2016 00:22:39 +0100 Subject: [PATCH 08/34] Added strings to for correct display in the preferences_fragment; changed strings.xml in de and eng; Changed some upper case letters in the strings.tutorial.xml --- Habitica/res/values-de/strings.tutorial.xml | 2 +- Habitica/res/values-de/strings.xml | 8 ++++++-- Habitica/res/values/strings.xml | 2 ++ Habitica/res/xml/preferences_fragment.xml | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Habitica/res/values-de/strings.tutorial.xml b/Habitica/res/values-de/strings.tutorial.xml index 725092ea9..f76f16c67 100644 --- a/Habitica/res/values-de/strings.tutorial.xml +++ b/Habitica/res/values-de/strings.tutorial.xml @@ -2,7 +2,7 @@ Schließe positive Gewohnheiten ab, um Gold und Erfahrung zu erhalten! Negative Gewohnheiten fügen Deinem Avatar beim Antippen Schaden zu, versuche diese also im echten Leben zu vermeiden! Besiege Deine täglichen Aufgaben um Gold und Erfahrung zu erhalten. Vorsicht! Tägliche Aufgaben fügen Dir Schaden zu, wenn Du sie nicht rechtzeitig schaffst. - Erledige Deine To-Dos im echten Leben und hake diese ab, um GOLD und ERFAHRUNG zu erhalten und so Belohnungen und neue Features freizuschalten! + Erledige Deine To-Dos im echten Leben und hake diese ab, um Gold und Erfahrung zu erhalten und so Belohnungen und neue Features freizuschalten! Dies sind Deine Belohnungen! Erwirb Gold, indem Du reale Gewohnheiten, tägliche Aufgaben und To-Dos abschließt. Gib dieses hinterher für Belohnungen im Spiel oder selbsterstellte Belohnungen in der Realität aus! Wenn Du Ausrüstung kaufst, taucht diese hier auf. Deine Kampfausrüstung beeinflusst Deine Spielerstatistiken, und Dein Kostüm (falls aktiviert) beeinflusst Dein Aussehen. Verdiene Gegenstände indem Du Aufgaben erledigst und Stufen aufsteigst. Tippe auf einen Gegenstand um ihn zu benutzen! diff --git a/Habitica/res/values-de/strings.xml b/Habitica/res/values-de/strings.xml index cfc3f71d1..d91454036 100644 --- a/Habitica/res/values-de/strings.xml +++ b/Habitica/res/values-de/strings.xml @@ -16,7 +16,7 @@ Habiticas Sprache ändern Dein QR Code Kontaktiere mich - Ein Fehler ist aufgetreten... + Ein Fehler ist aufgetreten… Konto Erster Tag der Woche Erster Tag der Woche in allen Kalendern @@ -27,6 +27,7 @@ Persönlicher Tagesstart einstellen Push-Benachrichtigungen des Benutzers Push-Benachrichtigungen + Ändere die Einstellungen deiner Push-Benachrichtigungen Du hast einen Wettbewerb gewonnen! Private Nachricht erhalten Geschenkte Edelsteine @@ -35,6 +36,8 @@ Zur Gilde eingeladen Deine Quest hat begonnen Zur Quest eingeladen + Audio Thema + Ändern des Habitica Audio Themas Wert Neuer To-Do-Eintrag @@ -54,6 +57,7 @@ Ausloggen Logge Dich aus Kontodetails + Überprüfe deine Accountdetails Willkommen Wiederbeleben Baue eine Verbindung mit Hilfe der App auf, bevor Du ein Widget benutzt @@ -384,7 +388,7 @@ Für den Anfang: Welche Bereiche Deines Lebens möchtest Du verbessern? Neue Aufgabe Neue Gewohnheit Neue Tägliche Aufgabe - Neue To-Do + Neues To-Do Neue Belohnung Du hast alle deine täglichen Aufgaben erledigt. Gut gemacht! Habitica: Gewohnheit diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index b8851355b..09a5e11da 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -33,6 +33,7 @@ User Push Notifications Push Notifications + Set your push notifications settings You won a Challenge! Received a Private Message Gifted Gems @@ -62,6 +63,7 @@ Logout Log out of your account Account Details + Check your account details Welcome Revive diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index 78210bb17..49476d53b 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -9,7 +9,7 @@ @@ -123,7 +123,7 @@ From a084d776e98d0790187f5fab8171b47908c9724e Mon Sep 17 00:00:00 2001 From: Negue Date: Sat, 19 Nov 2016 00:56:45 +0100 Subject: [PATCH 09/34] refresh todolist widget --- .../habitica/ui/activities/MainActivity.java | 19 +++---------------- ...tProvider.java => DailiesListFactory.java} | 5 +++-- .../widget/DailiesWidgetProvider.java | 5 +++++ .../habitica/widget/DailiesWidgetService.java | 3 ++- ...ListProvider.java => TaskListFactory.java} | 4 ++-- .../widget/TaskListWidgetProvider.java | 13 +++---------- ...ListProvider.java => TodoListFactory.java} | 4 ++-- .../widget/TodoListWidgetProvider.java | 5 +++++ .../habitica/widget/TodosWidgetService.java | 2 +- 9 files changed, 26 insertions(+), 34 deletions(-) rename Habitica/src/main/java/com/habitrpg/android/habitica/widget/{DailiesListProvider.java => DailiesListFactory.java} (65%) rename Habitica/src/main/java/com/habitrpg/android/habitica/widget/{TaskListProvider.java => TaskListFactory.java} (96%) rename Habitica/src/main/java/com/habitrpg/android/habitica/widget/{TodoListProvider.java => TodoListFactory.java} (65%) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index c38b0505c..295b269bb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -1,10 +1,8 @@ package com.habitrpg.android.habitica.ui.activities; -import android.app.AlarmManager; -import android.app.PendingIntent; import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; @@ -19,10 +17,6 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; -import android.media.AudioAttributes; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.media.SoundPool; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -43,15 +37,11 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; -import com.amplitude.api.Amplitude; import com.crashlytics.android.Crashlytics; import com.habitrpg.android.habitica.APIHelper; -import com.habitrpg.android.habitica.helpers.SoundFile; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HostConfig; -import com.habitrpg.android.habitica.NotificationPublisher; import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.helpers.SoundFileLoader; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.ItemsCallback; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; @@ -72,7 +62,6 @@ import com.habitrpg.android.habitica.events.TaskRemovedEvent; import com.habitrpg.android.habitica.events.TaskSaveEvent; import com.habitrpg.android.habitica.events.ToggledEditTagsEvent; import com.habitrpg.android.habitica.events.ToggledInnStateEvent; -import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand; import com.habitrpg.android.habitica.events.commands.BuyGemItemCommand; import com.habitrpg.android.habitica.events.commands.BuyRewardCommand; import com.habitrpg.android.habitica.events.commands.ChecklistCheckedCommand; @@ -96,7 +85,6 @@ import com.habitrpg.android.habitica.ui.AvatarView; import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; import com.habitrpg.android.habitica.ui.TutorialView; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; -import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment; import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils; import com.habitrpg.android.habitica.ui.helpers.UiUtils; import com.habitrpg.android.habitica.ui.menu.MainDrawerBuilder; @@ -104,6 +92,7 @@ import com.habitrpg.android.habitica.userpicture.BitmapUtils; import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider; import com.habitrpg.android.habitica.widget.DailiesWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; +import com.habitrpg.android.habitica.widget.TodoListWidgetProvider; import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.Preferences; @@ -149,8 +138,6 @@ import com.raizlabs.android.dbflow.structure.BaseModel; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; -import org.solovyev.android.checkout.ActivityCheckout; -import org.solovyev.android.checkout.Checkout; import java.io.File; import java.util.ArrayList; @@ -170,7 +157,6 @@ import butterknife.BindView; import retrofit2.adapter.rxjava.HttpException; import rx.Observable; import rx.functions.Action1; -import rx.schedulers.Schedulers; import static com.habitrpg.android.habitica.ui.helpers.UiUtils.SnackbarDisplayType; import static com.habitrpg.android.habitica.ui.helpers.UiUtils.showSnackbar; @@ -334,6 +320,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha @Override protected void onPause() { updateWidget(AvatarStatsWidgetProvider.class); + updateWidget(TodoListWidgetProvider.class); updateWidget(DailiesWidgetProvider.class); updateWidget(HabitButtonWidgetProvider.class); super.onPause(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListFactory.java similarity index 65% rename from Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java rename to Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListFactory.java index 44bbde43d..08e49fe57 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListFactory.java @@ -5,8 +5,9 @@ import android.content.Intent; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; -public class DailiesListProvider extends TaskListProvider { - public DailiesListProvider(Context context, Intent intent) { + +public class DailiesListFactory extends TaskListFactory { + public DailiesListFactory(Context context, Intent intent) { super(context, intent, Task.TYPE_DAILY); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java index 3f416ea9c..9664986ca 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java @@ -6,5 +6,10 @@ public class DailiesWidgetProvider extends TaskListWidgetProvider{ protected Class getServiceClass() { return DailiesWidgetService.class; } + + @Override + protected Class getProviderClass() { + return DailiesWidgetProvider.class; + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java index 094448126..1119d6201 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.java @@ -3,11 +3,12 @@ package com.habitrpg.android.habitica.widget; import android.content.Intent; import android.widget.RemoteViewsService; + public class DailiesWidgetService extends RemoteViewsService { @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { - return new DailiesListProvider(this.getApplicationContext(), intent); + return new DailiesListFactory(this.getApplicationContext(), intent); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.java similarity index 96% rename from Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListProvider.java rename to Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.java index 8bc17e635..6d94ac981 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.java @@ -24,14 +24,14 @@ import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; -public abstract class TaskListProvider implements RemoteViewsService.RemoteViewsFactory { +public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsFactory { private final int widgetId; private String taskType; private List taskList = new ArrayList<>(); private Context context = null; private boolean reloadData; - public TaskListProvider(Context context, Intent intent, String taskType) { + public TaskListFactory(Context context, Intent intent, String taskType) { this.context = context; this.widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); this.reloadData = false; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java index 98a84ee5c..c32302cd9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java @@ -30,8 +30,6 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider { APIHelper apiHelper; @Inject HostConfig hostConfig; - @Inject - public SharedPreferences sharedPreferences; private void setUp(Context context) { if (apiHelper == null) { @@ -41,6 +39,7 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider { } protected abstract Class getServiceClass(); + protected abstract Class getProviderClass(); @Override @@ -72,8 +71,7 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { setUp(context); - ComponentName thisWidget = new ComponentName(context, - DailiesWidgetProvider.class); + ComponentName thisWidget = new ComponentName(context, getProviderClass()); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); if (Build.VERSION.SDK_INT >= 16) { @@ -92,7 +90,7 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider { rv.setRemoteAdapter(appWidgetIds[i], R.id.list_view, intent); rv.setEmptyView(R.id.list, R.id.empty_view); - Intent taskIntent = new Intent(context, DailiesWidgetProvider.class); + Intent taskIntent = new Intent(context, getProviderClass()); taskIntent.setAction(DAILY_ACTION); taskIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); @@ -108,11 +106,6 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider { super.onUpdate(context, appWidgetManager, appWidgetIds); } - @Override - public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { - super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); - } - @Override public int layoutResourceId() { return R.layout.widget_dailies; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.java similarity index 65% rename from Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListProvider.java rename to Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.java index 0f24c7edc..3586d7369 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.java @@ -5,8 +5,8 @@ import android.content.Intent; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; -public class TodoListProvider extends TaskListProvider { - public TodoListProvider(Context context, Intent intent) { +public class TodoListFactory extends TaskListFactory { + public TodoListFactory(Context context, Intent intent) { super(context, intent, Task.TYPE_TODO); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java index 185a14da0..bc4859e5b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java @@ -6,4 +6,9 @@ public class TodoListWidgetProvider extends TaskListWidgetProvider{ protected Class getServiceClass() { return TodosWidgetService.class; } + + @Override + protected Class getProviderClass() { + return TodoListWidgetProvider.class; + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.java index e84a6a5db..c15af4164 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.java @@ -7,6 +7,6 @@ public class TodosWidgetService extends RemoteViewsService { @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { - return new TodoListProvider(this.getApplicationContext(), intent); + return new TodoListFactory(this.getApplicationContext(), intent); } } From 9841a7fddccff2f66123c7bd91ec03ffab264078 Mon Sep 17 00:00:00 2001 From: d954mas Date: Sat, 19 Nov 2016 13:07:18 +0300 Subject: [PATCH 10/34] update leak canary --- Habitica/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index dcb13a34b..7e842c384 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -130,15 +130,15 @@ dependencies { //Tests testCompile "junit:junit:4.10" testCompile "org.assertj:assertj-core:1.7.0" - testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' + testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' testCompile "org.robolectric:robolectric:3.1" testCompile 'org.robolectric:shadows-multidex:3.1' testCompile "org.robolectric:shadows-support-v4:3.1" testCompile "org.mockito:mockito-core:1.10.19" //Leak Detection - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' + debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' + releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' //Push Notifications compile 'com.google.firebase:firebase-core:9.4.0' From 6f07bb79a531178e83778797de82992125d81149 Mon Sep 17 00:00:00 2001 From: d954mas Date: Sat, 19 Nov 2016 14:29:45 +0300 Subject: [PATCH 11/34] remove picasso --- Habitica/build.gradle | 5 +--- Habitica/res/layout/activity_full_profile.xml | 2 +- Habitica/res/layout/activity_maintenance.xml | 2 +- Habitica/res/layout/animal_overview_item.xml | 2 +- .../avatar_background_overview_card.xml | 2 +- .../customization_grid_background_item.xml | 2 +- .../res/layout/customization_grid_item.xml | 2 +- .../layout/dialog_purchase_customization.xml | 2 +- Habitica/res/layout/fragment_group_info.xml | 2 +- Habitica/res/layout/fragment_intro.xml | 2 +- .../res/layout/fragment_quest_collect.xml | 2 +- Habitica/res/layout/gear_list_item.xml | 2 +- Habitica/res/layout/item_image_row.xml | 2 +- Habitica/res/layout/item_item.xml | 2 +- Habitica/res/layout/pet_detail_item.xml | 2 +- Habitica/res/layout/pet_imageview.xml | 2 +- Habitica/res/layout/qr_code.xml | 2 +- Habitica/res/layout/reward_item_card.xml | 2 +- Habitica/res/layout/row_shopitem.xml | 5 ++-- Habitica/res/layout/shop_header.xml | 2 +- Habitica/res/layout/skill_list_item.xml | 2 +- Habitica/res/layout/value_bar.xml | 2 +- .../android/habitica/ui/ItemDetailDialog.java | 8 ++--- .../habitica/ui/activities/MainActivity.java | 6 ++-- .../ui/activities/MaintenanceActivity.java | 8 ++--- .../CustomizationRecyclerViewAdapter.java | 6 ++-- .../ui/adapter/SkillsRecyclerViewAdapter.java | 4 +-- .../EquipmentRecyclerViewAdapter.java | 11 +++---- .../inventory/MountDetailRecyclerAdapter.java | 4 +-- .../inventory/PetDetailRecyclerAdapter.java | 4 +-- .../inventory/ShopRecyclerAdapter.java | 7 ++--- .../inventory/StableRecyclerAdapter.java | 6 ++-- .../setup/CustomizationSetupAdapter.java | 4 +-- .../QuestCollectRecyclerViewAdapter.java | 10 +++---- .../habitica/ui/helpers/DataBindingUtils.java | 17 ++++------- .../viewHolders/tasks/RewardViewHolder.java | 10 ++----- .../habitica/userpicture/UserPicture.java | 29 +++---------------- 37 files changed, 69 insertions(+), 115 deletions(-) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 7e842c384..d92b81f38 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -74,10 +74,7 @@ dependencies { compile 'com.android.support:recyclerview-v7:24.2.1' compile 'com.android.support:preference-v14:24.2.1' compile 'com.android.support:multidex:1.0.1' - - // Image Loading/Caching - compile 'com.squareup.picasso:picasso:2.5.2' - + //QR Code compile 'com.github.kenglxn.QRGen:android:2.2.0' diff --git a/Habitica/res/layout/activity_full_profile.xml b/Habitica/res/layout/activity_full_profile.xml index 0f16b897a..b1db9e974 100644 --- a/Habitica/res/layout/activity_full_profile.xml +++ b/Habitica/res/layout/activity_full_profile.xml @@ -294,7 +294,7 @@ android:text="@string/attributes" android:textStyle="bold" /> - - - - - - - - - - - - - - - diff --git a/Habitica/res/layout/qr_code.xml b/Habitica/res/layout/qr_code.xml index 48e498814..6a014e57d 100644 --- a/Habitica/res/layout/qr_code.xml +++ b/Habitica/res/layout/qr_code.xml @@ -20,7 +20,7 @@ android:layout_height="300dp" android:id="@+id/qrCodeWrapper"> - - - + - - - , Ha .compose(apiHelper.configureApiCallObserver()) .subscribe(new ItemsCallback(user1 -> { FrameLayout petWrapper = (FrameLayout) getLayoutInflater().inflate(R.layout.pet_imageview, null); - ImageView petImageView = (ImageView) petWrapper.findViewById(R.id.pet_imageview); + SimpleDraweeView petImageView = (SimpleDraweeView) petWrapper.findViewById(R.id.pet_imageview); DataBindingUtils.loadImage(petImageView, "Pet-" + event.usingEgg.getKey() + "-" + event.usingHatchingPotion.getKey()); String potionName = event.usingHatchingPotion.getText(); @@ -1142,7 +1142,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha showSnackbar(MainActivity.this, floatingMenuWrapper, getString(R.string.notification_pet_fed, pet.getColorText(), pet.getAnimalText()), SnackbarDisplayType.NORMAL); if (feedResponse.value == -1) { FrameLayout mountWrapper = (FrameLayout) getLayoutInflater().inflate(R.layout.pet_imageview, null); - ImageView mountImageView = (ImageView) mountWrapper.findViewById(R.id.pet_imageview); + SimpleDraweeView mountImageView = (SimpleDraweeView) mountWrapper.findViewById(R.id.pet_imageview); DataBindingUtils.loadImage(mountImageView, "Mount_Icon_" + event.usingPet.getKey()); String colorName = event.usingPet.getColorText(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.java index 72bd539ad..2356896b6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.java @@ -1,10 +1,10 @@ package com.habitrpg.android.habitica.ui.activities; +import com.facebook.drawee.view.SimpleDraweeView; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService; -import com.squareup.picasso.Picasso; import net.pherth.android.emoji_library.EmojiTextView; @@ -14,7 +14,6 @@ import android.os.Bundle; import android.text.method.LinkMovementMethod; import android.view.View; import android.widget.Button; -import android.widget.ImageView; import android.widget.TextView; import javax.inject.Inject; @@ -31,7 +30,7 @@ public class MaintenanceActivity extends BaseActivity { @BindView(R.id.titleTextView) TextView titleTextView; @BindView(R.id.imageView) - ImageView imageView; + SimpleDraweeView imageView; @BindView(R.id.descriptionTextView) EmojiTextView descriptionTextView; @BindView(R.id.playStoreButton) @@ -50,7 +49,8 @@ public class MaintenanceActivity extends BaseActivity { Bundle data = getIntent().getExtras(); this.titleTextView.setText(data.getString("title")); - Picasso.with(this).load(data.getString("imageUrl")).into(this.imageView); + + imageView.setImageURI(Uri.parse(data.getString("imageUrl"))); this.descriptionTextView.setText(MarkdownParser.parseMarkdown(data.getString("description"))); this.descriptionTextView.setMovementMethod(LinkMovementMethod.getInstance()); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.java index dc5ebcbff..b7bbc29b0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.java @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.ui.adapter; +import com.facebook.drawee.view.SimpleDraweeView; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand; import com.habitrpg.android.habitica.events.commands.UnlockPathCommand; @@ -19,7 +20,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; @@ -147,7 +147,7 @@ public class CustomizationRecyclerViewAdapter extends RecyclerView.Adapter Date: Sat, 19 Nov 2016 19:13:39 +0100 Subject: [PATCH 12/34] set todo list widget title, if tapped - open app, show unchecked todo icon --- .../res/layout/widget_dailies_list_row.xml | 61 ++++++++++--------- ...idget_dailies.xml => widget_task_list.xml} | 2 +- Habitica/res/layout/widget_todo_list_row.xml | 42 +++++++++++++ Habitica/res/xml/task_list_widget_info.xml | 2 +- .../habitica/widget/DailiesListFactory.java | 6 +- .../widget/DailiesWidgetProvider.java | 7 +++ .../habitica/widget/TaskListFactory.java | 10 +-- .../widget/TaskListWidgetProvider.java | 13 +++- .../habitica/widget/TodoListFactory.java | 3 +- .../widget/TodoListWidgetProvider.java | 7 +++ 10 files changed, 112 insertions(+), 41 deletions(-) rename Habitica/res/layout/{widget_dailies.xml => widget_task_list.xml} (96%) create mode 100644 Habitica/res/layout/widget_todo_list_row.xml diff --git a/Habitica/res/layout/widget_dailies_list_row.xml b/Habitica/res/layout/widget_dailies_list_row.xml index ae723e2e3..41d92b94c 100644 --- a/Habitica/res/layout/widget_dailies_list_row.xml +++ b/Habitica/res/layout/widget_dailies_list_row.xml @@ -1,35 +1,40 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/xml/task_list_widget_info.xml b/Habitica/res/xml/task_list_widget_info.xml index db0b85187..ce80082d1 100644 --- a/Habitica/res/xml/task_list_widget_info.xml +++ b/Habitica/res/xml/task_list_widget_info.xml @@ -1,6 +1,6 @@ taskList = new ArrayList<>(); private Context context = null; private boolean reloadData; - public TaskListFactory(Context context, Intent intent, String taskType) { + public TaskListFactory(Context context, Intent intent, String taskType, int listItemResId) { this.context = context; this.widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); + this.listItemResId = listItemResId; this.reloadData = false; this.taskType = taskType; @@ -85,7 +87,7 @@ public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsF @Override public RemoteViews getViewAt(int position) { final RemoteViews remoteView = new RemoteViews( - context.getPackageName(), R.layout.widget_dailies_list_row); + context.getPackageName(), listItemResId); if (taskList.size() > position) { Task task = taskList.get(position); @@ -98,14 +100,14 @@ public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsF remoteView.setInt(R.id.checkbox_background, "setBackgroundResource", task.getLightTaskColor()); Intent fillInIntent = new Intent(); fillInIntent.putExtra(TaskListWidgetProvider.TASK_ID_ITEM, task.getId()); - remoteView.setOnClickFillInIntent(R.id.dailies_list_row, fillInIntent); + remoteView.setOnClickFillInIntent(R.id.widget_list_row, fillInIntent); } return remoteView; } @Override public RemoteViews getLoadingView() { - return new RemoteViews(context.getPackageName(), R.layout.widget_dailies_list_row); + return new RemoteViews(context.getPackageName(), listItemResId); } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java index c32302cd9..997977bf7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.java @@ -5,7 +5,6 @@ import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -15,6 +14,7 @@ import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.raizlabs.android.dbflow.sql.builder.Condition; @@ -40,6 +40,7 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider { protected abstract Class getServiceClass(); protected abstract Class getProviderClass(); + protected abstract int getTitleResId(); @Override @@ -86,9 +87,15 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider { Intent intent = new Intent(context, getServiceClass()); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); - RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_dailies); + RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_task_list); rv.setRemoteAdapter(appWidgetIds[i], R.id.list_view, intent); rv.setEmptyView(R.id.list, R.id.empty_view); + rv.setTextViewText(R.id.widget_title, context.getString(getTitleResId())); + + // if the user click on the title: open App + Intent openAppIntent = new Intent(context.getApplicationContext(), MainActivity.class); + PendingIntent openApp = PendingIntent.getActivity(context, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT); + rv.setOnClickPendingIntent(R.id.widget_title, openApp); Intent taskIntent = new Intent(context, getProviderClass()); taskIntent.setAction(DAILY_ACTION); @@ -108,7 +115,7 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider { @Override public int layoutResourceId() { - return R.layout.widget_dailies; + return R.layout.widget_task_list; } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.java index 3586d7369..db7198dca 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.java @@ -3,10 +3,11 @@ package com.habitrpg.android.habitica.widget; import android.content.Context; import android.content.Intent; +import com.habitrpg.android.habitica.R; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; public class TodoListFactory extends TaskListFactory { public TodoListFactory(Context context, Intent intent) { - super(context, intent, Task.TYPE_TODO); + super(context, intent, Task.TYPE_TODO, R.layout.widget_todo_list_row); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java index bc4859e5b..4511cd8cd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListWidgetProvider.java @@ -1,5 +1,7 @@ package com.habitrpg.android.habitica.widget; +import com.habitrpg.android.habitica.R; + public class TodoListWidgetProvider extends TaskListWidgetProvider{ @Override @@ -11,4 +13,9 @@ public class TodoListWidgetProvider extends TaskListWidgetProvider{ protected Class getProviderClass() { return TodoListWidgetProvider.class; } + + @Override + protected int getTitleResId() { + return R.string.todos; + } } From 63f745bcd21eaf079cf96ffe64bd6822a7142148 Mon Sep 17 00:00:00 2001 From: AlbrechtRoehm Date: Mon, 5 Dec 2016 19:21:45 +0100 Subject: [PATCH 13/34] Revert "Added strings to for correct display in the preferences_fragment; changed strings.xml in de and eng; Changed some upper case letters in the strings.tutorial.xml" This reverts commit 57867549a2ba4f0f7db6b1ef981680ac3a0413c2. --- Habitica/res/values-de/strings.tutorial.xml | 2 +- Habitica/res/values-de/strings.xml | 8 ++------ Habitica/res/values/strings.xml | 2 -- Habitica/res/xml/preferences_fragment.xml | 4 ++-- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Habitica/res/values-de/strings.tutorial.xml b/Habitica/res/values-de/strings.tutorial.xml index f76f16c67..725092ea9 100644 --- a/Habitica/res/values-de/strings.tutorial.xml +++ b/Habitica/res/values-de/strings.tutorial.xml @@ -2,7 +2,7 @@ Schließe positive Gewohnheiten ab, um Gold und Erfahrung zu erhalten! Negative Gewohnheiten fügen Deinem Avatar beim Antippen Schaden zu, versuche diese also im echten Leben zu vermeiden! Besiege Deine täglichen Aufgaben um Gold und Erfahrung zu erhalten. Vorsicht! Tägliche Aufgaben fügen Dir Schaden zu, wenn Du sie nicht rechtzeitig schaffst. - Erledige Deine To-Dos im echten Leben und hake diese ab, um Gold und Erfahrung zu erhalten und so Belohnungen und neue Features freizuschalten! + Erledige Deine To-Dos im echten Leben und hake diese ab, um GOLD und ERFAHRUNG zu erhalten und so Belohnungen und neue Features freizuschalten! Dies sind Deine Belohnungen! Erwirb Gold, indem Du reale Gewohnheiten, tägliche Aufgaben und To-Dos abschließt. Gib dieses hinterher für Belohnungen im Spiel oder selbsterstellte Belohnungen in der Realität aus! Wenn Du Ausrüstung kaufst, taucht diese hier auf. Deine Kampfausrüstung beeinflusst Deine Spielerstatistiken, und Dein Kostüm (falls aktiviert) beeinflusst Dein Aussehen. Verdiene Gegenstände indem Du Aufgaben erledigst und Stufen aufsteigst. Tippe auf einen Gegenstand um ihn zu benutzen! diff --git a/Habitica/res/values-de/strings.xml b/Habitica/res/values-de/strings.xml index d91454036..cfc3f71d1 100644 --- a/Habitica/res/values-de/strings.xml +++ b/Habitica/res/values-de/strings.xml @@ -16,7 +16,7 @@ Habiticas Sprache ändern Dein QR Code Kontaktiere mich - Ein Fehler ist aufgetreten… + Ein Fehler ist aufgetreten... Konto Erster Tag der Woche Erster Tag der Woche in allen Kalendern @@ -27,7 +27,6 @@ Persönlicher Tagesstart einstellen Push-Benachrichtigungen des Benutzers Push-Benachrichtigungen - Ändere die Einstellungen deiner Push-Benachrichtigungen Du hast einen Wettbewerb gewonnen! Private Nachricht erhalten Geschenkte Edelsteine @@ -36,8 +35,6 @@ Zur Gilde eingeladen Deine Quest hat begonnen Zur Quest eingeladen - Audio Thema - Ändern des Habitica Audio Themas Wert Neuer To-Do-Eintrag @@ -57,7 +54,6 @@ Ausloggen Logge Dich aus Kontodetails - Überprüfe deine Accountdetails Willkommen Wiederbeleben Baue eine Verbindung mit Hilfe der App auf, bevor Du ein Widget benutzt @@ -388,7 +384,7 @@ Für den Anfang: Welche Bereiche Deines Lebens möchtest Du verbessern? Neue Aufgabe Neue Gewohnheit Neue Tägliche Aufgabe - Neues To-Do + Neue To-Do Neue Belohnung Du hast alle deine täglichen Aufgaben erledigt. Gut gemacht! Habitica: Gewohnheit diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 09a5e11da..b8851355b 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -33,7 +33,6 @@ User Push Notifications Push Notifications - Set your push notifications settings You won a Challenge! Received a Private Message Gifted Gems @@ -63,7 +62,6 @@ Logout Log out of your account Account Details - Check your account details Welcome Revive diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index 49476d53b..78210bb17 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -9,7 +9,7 @@ @@ -123,7 +123,7 @@ From 6c10c13ad07f89d3142942a14df10cf038f5b2af Mon Sep 17 00:00:00 2001 From: AlbrechtRoehm Date: Mon, 5 Dec 2016 19:26:54 +0100 Subject: [PATCH 14/34] Remove translations from commit --- Habitica/res/values/strings.xml | 2 ++ Habitica/res/xml/preferences_fragment.xml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index b8851355b..74ec2bc4e 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -33,6 +33,7 @@ User Push Notifications Push Notifications + Set your push notifications settings You won a Challenge! Received a Private Message Gifted Gems @@ -61,6 +62,7 @@ Logout Log out of your account + Check your account details Account Details Welcome diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index 78210bb17..49476d53b 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -9,7 +9,7 @@ @@ -123,7 +123,7 @@ From 87750ccee13efd46f833dbdaba06e95f5780dc40 Mon Sep 17 00:00:00 2001 From: d954mas Date: Tue, 6 Dec 2016 21:03:13 +0300 Subject: [PATCH 15/34] remove unused classes --- .../habitica/userpicture/UserPicture.java | 290 ------------------ .../userpicture/UserPictureRunnable.java | 8 - 2 files changed, 298 deletions(-) delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPicture.java delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPictureRunnable.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPicture.java b/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPicture.java deleted file mode 100644 index b091688a1..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPicture.java +++ /dev/null @@ -1,290 +0,0 @@ -package com.habitrpg.android.habitica.userpicture; - -public class UserPicture { - - /* final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); - private static final int WIDTH = 140; - private static final int HEIGHT = 147; - private static final int COMPACT_WIDTH = 114; - private static final int COMPACT_HEIGHT = 114; - final List layers = new ArrayList<>(); - final List targets = new ArrayList<>(); - private HabitRPGUser user; - private ImageView imageView; - private UserPictureRunnable runnable; - private Context context; - private AtomicInteger numOfTasks = new AtomicInteger(0); - private boolean hasBackground, hasPetMount; - private boolean userHasBackground, userHasPet, userHasMount; - private String currentCacheFileName; - - public UserPicture(Context context) { - this.context = context; - this.hasBackground = true; - this.hasPetMount = true; - } - - public UserPicture(Context context, boolean hasBackground, boolean hasPetMount) { - this.context = context; - this.hasBackground = hasBackground; - this.hasPetMount = hasPetMount; - } - - private static String generateHashCode(String value) { - byte[] digest = new byte[0]; - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - - md.update(value.getBytes()); - digest = md.digest(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - - return bytesToHex(digest); - } - - public static String bytesToHex(byte[] bytes) { - char[] hexChars = new char[bytes.length * 2]; - for (int j = 0; j < bytes.length; j++) { - int v = bytes[j] & 0xFF; - hexChars[j * 2] = hexArray[v >>> 4]; - hexChars[j * 2 + 1] = hexArray[v & 0x0F]; - } - return new String(hexChars); - } - - public void setUser(HabitRPGUser user) { - this.user = user; - } - - public void removeTask() { - this.numOfTasks.decrementAndGet(); - } - - public void allTasksComplete() { - if (this.numOfTasks.get() == 0) { - BitmapFactory.Options o = new BitmapFactory.Options(); - o.inScaled = false; - - Bitmap res = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888); - Canvas myCanvas = new Canvas(res); - Integer layerNumber = 0; - for (Bitmap layerBitmap : this.layers) { - if (layerBitmap != null) { - modifyCanvas(layerBitmap, myCanvas, layerNumber); - } - layerNumber++; - } - if (!this.hasPetMount) { - res = Bitmap.createBitmap(res, 25, 0, COMPACT_WIDTH, COMPACT_HEIGHT); - } - BitmapUtils.saveToFile(currentCacheFileName, res); - if (this.imageView != null) { - final Bitmap image = res; - imageView.post(() -> imageView.setImageBitmap(image)); - } else { - this.runnable.run(res); - } - } - } - - public void setPictureOn(final ImageView imageView) { - if (this.user == null) { - return; - } - clearRunning(); - this.imageView = imageView; - List layerNames = UserPicture.this.getLayerNames(); - - final Bitmap cache = UserPicture.this.getCachedImage(layerNames); - - // yes => load image to bitmap - if (cache != null) { - imageView.setImageBitmap(cache); - return; - } - - // no => generate it - generateImage(layerNames); - } - - public void setPictureWithRunnable(UserPictureRunnable runnable) { - if (this.user == null) { - return; - } - this.clearRunning(); - this.runnable = runnable; - List layerNames = this.getLayerNames(); - - Bitmap cache = this.getCachedImage(layerNames); - - // yes => load image to bitmap - if (cache != null) { - runnable.run(cache); - return; - } - - // no => generate it - generateImage(layerNames); - } - - public Uri getCachedFileUri() { - return Uri.parse(BitmapUtils.getSavePath() + "/" + currentCacheFileName); - } - - private void clearRunning() { - for (SpriteTarget target : this.targets) { - // Picasso.with(this.context).cancelRequest(target); - } - this.targets.clear(); - this.numOfTasks.set(0); - this.layers.clear(); - this.imageView = null; - this.runnable = null; - } - - private List getLayerNames() { - List layerNames = this.user.getAvatarLayerNames(); - - String mountName = null; - if (this.user.getItems() != null) { - mountName = this.user.getItems().getCurrentMount(); - } - - if (mountName != null && !mountName.isEmpty() && hasPetMount) { - layerNames.add(0, "Mount_Body_" + mountName); - layerNames.add("Mount_Head_" + mountName); - this.userHasMount = true; - } else { - this.userHasMount = false; - } - - String petName = null; - if (this.user.getItems() != null) { - petName = this.user.getItems().getCurrentPet(); - } - - if (petName != null && !petName.isEmpty() && hasPetMount) { - layerNames.add("Pet-" + petName); - this.userHasPet = true; - } else { - this.userHasPet = false; - } - - String backgroundName = this.user.getPreferences().getBackground(); - - if (backgroundName != null && !backgroundName.isEmpty() && hasBackground) { - layerNames.add(0, "background_" + backgroundName); - this.userHasBackground = true; - } else { - this.userHasBackground = false; - } - return layerNames; - } - - private Bitmap getCachedImage(List layerNames) { - // get layer hash value - String fullLayerString = String.valueOf(hasBackground).concat(String.valueOf(hasPetMount)); - - for (String l : layerNames) { - fullLayerString = fullLayerString.concat(l); - } - - String layersHash = generateHashCode(fullLayerString); - currentCacheFileName = layersHash.concat(".png"); - - // does it already exist? - return BitmapUtils.loadFromFile(currentCacheFileName); - } - - private void generateImage(List layerNames) { - Integer layerNumber = 0; - this.numOfTasks.set(layerNames.size()); - this.layers.clear(); - // Picasso picasso = Picasso.with(this.context); - for (String layer : layerNames) { - this.layers.add(null); - SpriteTarget target = new SpriteTarget(layerNumber, layer); - this.targets.add(target); - picasso.load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/" + this.getFileName(layer)).into(target); - layerNumber = layerNumber + 1; - } - } - - private void modifyCanvas(Bitmap img, Canvas canvas, Integer layerNumber) { - Paint paint = new Paint(); - paint.setFilterBitmap(false); - - Integer xOffset = 25; - Integer yOffset = 18; - - if (this.hasBackground && this.userHasBackground && layerNumber == 0) { - xOffset = 0; - yOffset = 0; - } - - if (this.hasPetMount) { - if (this.userHasMount) { - if (((this.userHasBackground && layerNumber > 1) || - (!this.userHasBackground && layerNumber > 0)) && - ((this.userHasPet && layerNumber < (this.layers.size() - 2)) || - (!this.userHasPet && layerNumber < this.layers.size() - 1))) { - yOffset = 0; - } - } - } - - if (this.hasPetMount && this.userHasPet && layerNumber == this.layers.size() - 1) { - xOffset = 0; - yOffset = 43; - } - - canvas.drawBitmap(img, new Rect(0, 0, img.getWidth(), img.getHeight()), - new Rect(xOffset, yOffset, img.getWidth() + xOffset, img.getHeight() + yOffset), paint); - } - - private String getFileName(String imageName) { - if (imageName.equals("head_special_1")) { - return "ContributorOnly-Equip-CrystalHelmet.gif"; - } else if (imageName.equals("armor_special_1")) { - return "ContributorOnly-Equip-CrystalArmor.gif"; - } - return imageName + ".png"; - } - - private class SpriteTarget implements Target { - - private Integer layerNumber; - private String layer; - - public SpriteTarget(Integer layerNumber, String layer) { - this.layerNumber = layerNumber; - this.layer = layer; - } - - @Override - public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { - UserPicture.this.layers.set(this.layerNumber, bitmap); - UserPicture.this.removeTask(); - UserPicture.this.allTasksComplete(); - } - - @Override - public void onBitmapFailed(Drawable errorDrawable) { - Log.w("SpriteTarget", layer + " not on S3"); - - UserPicture.this.removeTask(); - UserPicture.this.allTasksComplete(); - } - - @Override - public void onPrepareLoad(Drawable placeHolderDrawable) { - } - }*/ - -} - - - - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPictureRunnable.java b/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPictureRunnable.java deleted file mode 100644 index ea8797492..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/userpicture/UserPictureRunnable.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.habitrpg.android.habitica.userpicture; - -import android.graphics.Bitmap; - -public interface UserPictureRunnable { - - void run(Bitmap avatarBitmap); -} From bad500aa43a1a12d2a5c802417d7b475a1fdb203 Mon Sep 17 00:00:00 2001 From: d954mas Date: Tue, 6 Dec 2016 21:38:41 +0300 Subject: [PATCH 16/34] fixed crashlyticsProxy initialization --- .../android/habitica/HabiticaBaseApplication.java | 11 ++++------- .../android/habitica/ReleaseDeveloperModule.java | 6 +++++- .../android/habitica/proxy/CrashlyticsProxyImpl.java | 3 +-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java index 8b00df48c..0c19796de 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java @@ -7,6 +7,7 @@ import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.components.DaggerAppComponent; import com.habitrpg.android.habitica.helpers.PurchaseTypes; import com.habitrpg.android.habitica.modules.AppModule; +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; import com.habitrpg.android.habitica.ui.activities.IntroActivity; import com.habitrpg.android.habitica.ui.activities.LoginActivity; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -53,6 +54,8 @@ public abstract class HabiticaBaseApplication extends MultiDexApplication { Lazy lazyApiHelper; @Inject SharedPreferences sharedPrefs; + @Inject + CrashlyticsProxy crashlyticsProxy; private static AppComponent component; /** * For better performance billing class should be used as singleton @@ -122,10 +125,10 @@ public abstract class HabiticaBaseApplication extends MultiDexApplication { public void onCreate() { super.onCreate(); setupDagger(); + crashlyticsProxy.init(this); setupLeakCanary(); setupFlowManager(); setupFacebookSdk(); - setupCrashlytics(); createBillingAndCheckout(); registerActivityLifecycleCallbacks(); @@ -197,12 +200,6 @@ public abstract class HabiticaBaseApplication extends MultiDexApplication { } } - private void setupCrashlytics() { - /* Crashlytics crashlytics = new Crashlytics.Builder() - .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) - .build(); - Fabric.with(this, crashlytics);*/ - } private void registerActivityLifecycleCallbacks() { registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { diff --git a/Habitica/src/release/java/com/habitrpg/android/habitica/ReleaseDeveloperModule.java b/Habitica/src/release/java/com/habitrpg/android/habitica/ReleaseDeveloperModule.java index 6aceb0af2..2421ebed3 100644 --- a/Habitica/src/release/java/com/habitrpg/android/habitica/ReleaseDeveloperModule.java +++ b/Habitica/src/release/java/com/habitrpg/android/habitica/ReleaseDeveloperModule.java @@ -2,8 +2,12 @@ package com.habitrpg.android.habitica; import com.habitrpg.android.habitica.modules.DeveloperModule; +import com.habitrpg.android.habitica.proxy.CrashlyticsProxyImpl; +import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; //change debug proxy here by override methods public class ReleaseDeveloperModule extends DeveloperModule { - + @Override protected CrashlyticsProxy provideCrashlyticsProxy() { + return new CrashlyticsProxyImpl(); + } } diff --git a/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java b/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java index 02f5574d0..606032e38 100644 --- a/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java +++ b/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.proxy; import com.crashlytics.android.Crashlytics; import com.crashlytics.android.core.CrashlyticsCore; -import com.habitrpg.android.habitica.BuildConfig; import com.habitrpg.android.habitica.proxy.ifce.CrashlyticsProxy; import android.content.Context; @@ -14,7 +13,7 @@ public class CrashlyticsProxyImpl implements CrashlyticsProxy { @Override public void init(Context context) { Crashlytics crashlytics = new Crashlytics.Builder() - .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) + .core(new CrashlyticsCore.Builder().build()) .build(); Fabric.with(context, crashlytics); } From 89420b81dacce073fbbd8ad3fed42da7b6922f4a Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 30 Nov 2016 17:36:57 +0100 Subject: [PATCH 17/34] implement seeds sdk --- Habitica/AndroidManifest.xml | 3 +- Habitica/build.gradle | 23 +- Habitica/res/drawable/seeds_badge_store.png | Bin 0 -> 6374 bytes Habitica/res/layout/fragment_gem_purchase.xml | 3 +- Habitica/res/layout/purchase_gem_view.xml | 17 +- Habitica/res/values/attrs_avatar_view.xml | 1 + .../habitica/HabiticaPurchaseVerifier.java | 13 + .../habitica/ui/GemPurchaseOptionsView.java | 11 + .../ui/activities/GemPurchaseActivity.java | 56 +- .../ui/fragments/GemsPurchaseFragment.java | 8 + .../lib/models/Preferences.java | 2 +- habitica.resources.example | 3 + seeds-sdk/LICENSE | 202 ++++ seeds-sdk/MoPub Client Licence.txt | 10 + seeds-sdk/NOTICE | 15 + seeds-sdk/build.gradle | 72 ++ seeds-sdk/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + seeds-sdk/gradlew | 160 +++ seeds-sdk/gradlew.bat | 90 ++ seeds-sdk/proguard-rules.pro | 17 + .../android/sdk/AdvertisingIdAdapterTest.java | 32 + .../android/sdk/ConnectionProcessorTests.java | 284 +++++ .../android/sdk/ConnectionQueueTests.java | 406 +++++++ .../android/sdk/CountlyStoreTests.java | 338 ++++++ .../playseeds/android/sdk/CountlyTests.java | 652 +++++++++++ .../android/sdk/CrashDetailsTest.java | 87 ++ .../playseeds/android/sdk/DeviceIdTests.java | 76 ++ .../android/sdk/DeviceInfoTests.java | 218 ++++ .../android/sdk/EventQueueTests.java | 105 ++ .../com/playseeds/android/sdk/EventTests.java | 325 ++++++ .../android/sdk/MessagingAdapterTest.java | 24 + .../android/sdk/ReferrerReceiverTest.java | 48 + .../com/playseeds/android/sdk/SeedsTest.java | 141 +++ .../playseeds/android/sdk/UserDataTests.java | 93 ++ .../GeneralInAppMessageProviderTest.java | 20 + .../InAppMessageManagerTest.java | 101 ++ .../InAppMessageRequestTest.java | 66 ++ .../InAppMessageResponseTest.java | 59 + .../android/sdk/inappmessaging/LogTest.java | 50 + .../inappmessaging/RequestExceptionTest.java | 43 + .../inappmessaging/ResourceManagerTest.java | 57 + .../inappmessaging/RichMediaActivityTest.java | 120 ++ .../android/sdk/inappmessaging/UtilTest.java | 60 + .../sdk/test/InstrumentationTestRunner.java | 33 + seeds-sdk/src/main/AndroidManifest.xml | 31 + .../android/sdk/AdvertisingIdAdapter.java | 62 + .../android/sdk/CertificateTrustManager.java | 93 ++ .../android/sdk/ConnectionProcessor.java | 238 ++++ .../android/sdk/ConnectionQueue.java | 318 +++++ .../playseeds/android/sdk/CountlyStore.java | 276 +++++ .../playseeds/android/sdk/CrashDetails.java | 405 +++++++ .../com/playseeds/android/sdk/DeviceId.java | 176 +++ .../com/playseeds/android/sdk/DeviceInfo.java | 255 ++++ .../java/com/playseeds/android/sdk/Event.java | 142 +++ .../com/playseeds/android/sdk/EventQueue.java | 109 ++ .../sdk/IInAppMessageShowCountListener.java | 5 + .../sdk/IInAppPurchaseCountListener.java | 5 + .../sdk/IUserBehaviorQueryListener.java | 6 + .../sdk/MainActivityEventListener.java | 116 ++ .../android/sdk/MessagingAdapter.java | 48 + .../android/sdk/OpenUDIDAdapter.java | 66 ++ .../android/sdk/ReferrerReceiver.java | 81 ++ .../java/com/playseeds/android/sdk/Seeds.java | 1035 +++++++++++++++++ .../com/playseeds/android/sdk/UserData.java | 213 ++++ .../android/sdk/inappmessaging/ClickType.java | 29 + .../android/sdk/inappmessaging/Const.java | 82 ++ .../android/sdk/inappmessaging/Gender.java | 32 + .../GeneralInAppMessageProvider.java | 95 ++ .../sdk/inappmessaging/InAppMessage.java | 26 + .../inappmessaging/InAppMessageListener.java | 33 + .../inappmessaging/InAppMessageManager.java | 580 +++++++++ .../inappmessaging/InAppMessageProvider.java | 60 + .../inappmessaging/InAppMessageRequest.java | 314 +++++ .../inappmessaging/InAppMessageResponse.java | 230 ++++ .../sdk/inappmessaging/InAppMessageView.java | 323 +++++ .../sdk/inappmessaging/InAppWebView.java | 102 ++ .../android/sdk/inappmessaging/Log.java | 94 ++ .../sdk/inappmessaging/RequestException.java | 37 + .../sdk/inappmessaging/ResourceManager.java | 200 ++++ .../sdk/inappmessaging/RichMediaActivity.java | 371 ++++++ .../android/sdk/inappmessaging/Util.java | 284 +++++ .../java/org/openudid/OpenUDID_manager.java | 200 ++++ .../java/org/openudid/OpenUDID_service.java | 37 + seeds-sdk/src/main/res/drawable/bar.png | Bin 0 -> 2773 bytes .../src/main/res/drawable/browser_back.png | Bin 0 -> 1032 bytes .../main/res/drawable/browser_external.png | Bin 0 -> 1640 bytes .../src/main/res/drawable/browser_forward.png | Bin 0 -> 1024 bytes .../src/main/res/drawable/browser_reload.png | Bin 0 -> 2054 bytes .../main/res/drawable/close_button_normal.png | Bin 0 -> 4730 bytes .../res/drawable/close_button_pressed.png | Bin 0 -> 5091 bytes seeds-sdk/src/main/res/drawable/skip.png | Bin 0 -> 4152 bytes .../src/main/res/drawable/video_pause.png | Bin 0 -> 311 bytes .../src/main/res/drawable/video_play.png | Bin 0 -> 1024 bytes .../src/main/res/drawable/video_replay.png | Bin 0 -> 2054 bytes seeds-sdk/src/test/AndroidManifest.xml | 66 ++ .../com/playseeds/android/sdk/SeedsTests.java | 116 ++ .../android/sdk/SeedsTestsRunner.java | 32 + settings.gradle | 2 +- 99 files changed, 11155 insertions(+), 20 deletions(-) create mode 100644 Habitica/res/drawable/seeds_badge_store.png create mode 100755 seeds-sdk/LICENSE create mode 100755 seeds-sdk/MoPub Client Licence.txt create mode 100644 seeds-sdk/NOTICE create mode 100755 seeds-sdk/build.gradle create mode 100644 seeds-sdk/gradle/wrapper/gradle-wrapper.jar create mode 100644 seeds-sdk/gradle/wrapper/gradle-wrapper.properties create mode 100644 seeds-sdk/gradlew create mode 100644 seeds-sdk/gradlew.bat create mode 100755 seeds-sdk/proguard-rules.pro create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/AdvertisingIdAdapterTest.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/ConnectionProcessorTests.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/ConnectionQueueTests.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/CountlyStoreTests.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/CountlyTests.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/CrashDetailsTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/DeviceIdTests.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/DeviceInfoTests.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/EventQueueTests.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/EventTests.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/MessagingAdapterTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/ReferrerReceiverTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/SeedsTest.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/UserDataTests.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/GeneralInAppMessageProviderTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/InAppMessageManagerTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/InAppMessageRequestTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/InAppMessageResponseTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/LogTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/RequestExceptionTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/ResourceManagerTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/RichMediaActivityTest.java create mode 100644 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/inappmessaging/UtilTest.java create mode 100755 seeds-sdk/src/androidTest/java/com/playseeds/android/sdk/test/InstrumentationTestRunner.java create mode 100755 seeds-sdk/src/main/AndroidManifest.xml create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/AdvertisingIdAdapter.java create mode 100644 seeds-sdk/src/main/java/com/playseeds/android/sdk/CertificateTrustManager.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/ConnectionProcessor.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/ConnectionQueue.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/CountlyStore.java create mode 100644 seeds-sdk/src/main/java/com/playseeds/android/sdk/CrashDetails.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/DeviceId.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/DeviceInfo.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/Event.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/EventQueue.java create mode 100644 seeds-sdk/src/main/java/com/playseeds/android/sdk/IInAppMessageShowCountListener.java create mode 100644 seeds-sdk/src/main/java/com/playseeds/android/sdk/IInAppPurchaseCountListener.java create mode 100644 seeds-sdk/src/main/java/com/playseeds/android/sdk/IUserBehaviorQueryListener.java create mode 100644 seeds-sdk/src/main/java/com/playseeds/android/sdk/MainActivityEventListener.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/MessagingAdapter.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/OpenUDIDAdapter.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/ReferrerReceiver.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/Seeds.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/UserData.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/ClickType.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/Const.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/Gender.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/GeneralInAppMessageProvider.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/InAppMessage.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/InAppMessageListener.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/InAppMessageManager.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/InAppMessageProvider.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/InAppMessageRequest.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/InAppMessageResponse.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/InAppMessageView.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/InAppWebView.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/Log.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/RequestException.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/ResourceManager.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/RichMediaActivity.java create mode 100755 seeds-sdk/src/main/java/com/playseeds/android/sdk/inappmessaging/Util.java create mode 100755 seeds-sdk/src/main/java/org/openudid/OpenUDID_manager.java create mode 100755 seeds-sdk/src/main/java/org/openudid/OpenUDID_service.java create mode 100755 seeds-sdk/src/main/res/drawable/bar.png create mode 100755 seeds-sdk/src/main/res/drawable/browser_back.png create mode 100755 seeds-sdk/src/main/res/drawable/browser_external.png create mode 100755 seeds-sdk/src/main/res/drawable/browser_forward.png create mode 100755 seeds-sdk/src/main/res/drawable/browser_reload.png create mode 100755 seeds-sdk/src/main/res/drawable/close_button_normal.png create mode 100755 seeds-sdk/src/main/res/drawable/close_button_pressed.png create mode 100755 seeds-sdk/src/main/res/drawable/skip.png create mode 100755 seeds-sdk/src/main/res/drawable/video_pause.png create mode 100755 seeds-sdk/src/main/res/drawable/video_play.png create mode 100755 seeds-sdk/src/main/res/drawable/video_replay.png create mode 100644 seeds-sdk/src/test/AndroidManifest.xml create mode 100644 seeds-sdk/src/test/java/com/playseeds/android/sdk/SeedsTests.java create mode 100644 seeds-sdk/src/test/java/com/playseeds/android/sdk/SeedsTestsRunner.java diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 17371d259..05d0cbe8f 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -24,7 +24,8 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + tools:replace="android:name"> ? zcQ^cl;oU2h6Y-LJtYTDW`jw)UuqHYNEe_-2n__Z5w2j`Sf11ox5KciCU}@x zx*M&YS)Zbj8C~jtf#O#e+K3kTtz5f7mLD3y4KvygY*A75x~Uu02dM(trTzWf9vb7> z9rydpru`C+l~4N*&psz7Pc1ZSt+Spq92|m1%?`8p2)4c_OeAkge0gW-%a6DEq{#>3t+{1E6%`qz_R;DLZY4`O;~}zs51}C|;k>rVbI|X{s zIl;e=!@+rURu8w8H3{gZ8iR;)LW={!i)9|^YZ_5A(RjQINukn&kncY;D9$!&5B{xW z=(k&#8-Wx(<-_SSd51-ww>&(jW>rAMzrBi~xenX8%um07 ztR9t;gB{mR5Y*yW3~J1H5j^iB&(peIiapYemld>bgc2WKIesz3X_DjnRP2EwDt+IT z{H{@iZngFx+K>Gisp3bimGyh%LTiw}MohZFE3~;;3KM-_Q{E~)gWqD*4AL;N2=?V6 zH79xzsAgZ?4nKQ0ahR+Z4{jcR)E}X^)p<55eJh94M}NZ{m;$z28Go22K0O<{)9rfm z0y!=IY|NY>{4w_;t=OjTDX*%wB&}8SuC?;~9!B6pd1!2<$cW%F-pL$4vbffY;|uN< z3O^u986s&g8+3lWUZh~z#$`*23U2!{)SI|(6XNG`DSq2wOMx(}nsj^5i4_v&(7r$_ zeZKL!t2&*us`O@BLvz+ZilzVfd!7X8Z1|*G#dQNBfmT1 z`0^c8JsO_cCunAc z(@w&mDHrTsHvyTMov_NMH?2L1AM@1bC9~M$x#Eb%XYTQo#<>WC;4Hd>{^8!331+nU zvaAIEMm^AL?6b^^mutjPn2P(Q{kjUr{C9y`Lr5}KwDL30b5b!Z8!0+4P*|(m{c?q~ zhD%W0s^?RL=5V?Jh`AKTMf;)eLBJuikoH#1?z zvLg~QtLT*Y?=DOSZA3VSC-AhN&EAbk8u&8%ulJ|n9o=yTKsvt4th^=AaS$E87h<-8Xr%+K#K zAS?s8I~KkyZM$Bf@$s{hIy3#Gx(gQ(O)q;>sX#WH+q=6JKZiC?S6%!q&0A%y$j7@i zO2gEr9`J>|otR+8=mw!5@)1hJtg>wL7eGR$@S%@AUUV@?o>DvBEBtsJ#e{Bd>9GY_ zYNEXSxG`b;w z;~4ZHDO}sQv6C8bhOLeA?tC(~4ADN(leH!xr1|R6ctJLB-4K8b&DFxTd@e$3s1*#9 zQB-l>!$&HOcKNFMVf_*X57;;oNi~6LVwaVPGhRNxs@jqx@>5qpviQVlpSmz?W6O@P z7T7(*ZYZJQfv5%lt+}$fx^R&O29NsdVeewlU`zE?GGJ~)AzKnQOeLAo>)Vx9i2u9= zcSq!!ziN)E9&4-SrSgfkR9_yNNN;(4D14Ti@jAV&WT@kt7SW+c4!y1C?#1J8VM;SK z4Urfvb;JQC!T6A|#64Vl`~_oB9^r5=bSx#odn=O0-K!6KC^y-Ho@8l_fbHevkV4}-FGUpd*6m*Qd@H(72L$hwxagr5E(zj20W8x`kA|9f_xoeShmi|Se*Jbqj2vIm=GI>-}LqL6SByv`| z+@sfCohUQMR+hgTX^ebo;=icfx~oleFT5MQNZ_UD{MBr1l_Eb{GC8dBPyDYmv@3vh zSpYA0s(2&iJJoo$_(4N3E>yvA3S$vGEiP7pn3~^3C|?PnRO#|pHAyu-c5)E6N=lMx zY*k0&YqZ*oaC^SdPgzE>5hk|m(+bhqNK!$YTyUpgua{mUgy*~Rj9I>_0FetF6c~zs zLMwd_3VEG8yCFq*T;0QZ_2zDVLL4b^g!G~M-tN>jGXwX;d$}>5l7ctAykIT?*}RmvN;_w>H#ZYyjv~n- zcP&jqx%1a&HvQ_hk57Z@Tom*CwdiJ@7Kt}1+5nYxMVU?{$g?}z)%*g)QL&u^c9`sA z-5SsHTvGpb0?{oCFlW$|E4kpNB z(j;*9Nsg9E2`wk>#cIqM9NyO=eVO5^E&muzB~x2EE~yK}adE%9e*`i89v-AXrEzl^ zwV&y_>jx3q1Soy*TuF6SsPT?uayZ+E2yq2Oyq`YDms&7T!8sfJgr}c;FkJY;$O=td zc+@n~->4{eiJ&rGSmK1F&+Uz1KYNbv#_inhBv5g81x@L}>C>^x$xw5pQ)I%pn zbu@OCkg?R7JS7EiLs@S~ zek`+Ph(l=liSEvKpT1aJv1n=uN%9<1@`KdPpl0lwjcAF_*H@Bm4OIO;c5)SLMf-=3 z(;!0MwjoauHQKb)JniyeK0Sfsye00LJs=4xeSB~NGLcw5oHG(|(!|B($eJCIy(#-} zQYu;FuP^9&m0;Z(i=<)<$93*R#l1E)SMSYY%Yj6TcsX zQnI)ro%Q{|DYGhPRN6W7GBb<@t*&HXoegauHb+x$5eNYCto+Yn@DkkuwE5|;j@$^=DAzmI)eR}_)>6Zg-}5Pv;Ae8%y4w!oW)SM+rr;aiY~ zeG&_X3xkF#2}zxb3#%r%h*VqjDP6xe6K)BUY-5$#wv)T6$RNxXa#lx<+ z2MMXSsbrkl4nKSJXAK2__SBWa?QWnXM@8dmn3?sP^#m)vbfwX~M$qY#8pXpz0>d#M z;aY(jg(6c7^RYwSFP9Zm6H|fo@q5nzv}cz@^@@7H?CiV?`!f0Q`$;?yP~K)m3{3WQqvo8sUAG23KIm?y|qV8BYm4Bjn2n}kt5|5jid9! zoR#D9o<6*#0ciVt7yO1FE@{3OYC7$^z=1~)&`zNmV}-z#0sXJYvK;HlvRN>^GM}!B zv%|DxB_y%;7~;2nSrsLmBahl>bjt-e3AqBQ18cf^NJo||(w+bApo`^4+>7N^8t-eX zL~jP80*Oe7lfnHp!_~6W`yu87=X2rEKb|_u6(1%#M{~<3It8e|J4l= zn~te4GHOw!2{0@$-xt^VYMb>+7+JDs`yf>_VO+APZdU z?YfOK2Du$knZ2PK6NA5GBopSnAhM%+9$m>@7`~64&2c{^U>`Klw@_*F{*J#g9w0(l zn!E82z8B*ni}!Rzg zcnm&^oo%w`mjD1^G~`3x-%f^WPvghE1Vn%;l2xfI%O{3w-qY^OhIzR@7)bV2v@nY6 zrzbMpmW}ZpsdV<-<^;$x65@sg@ot?ARQ?8>r9``s;Qc|^FEl{sR2JBA3t9Ulp(F;? zsLHBd{GC*0*56<5EhF%a1c-W?%l2R;(G|-bgb#Be4ht{g8r&k_tbePyAZcU_QdxNS zrR!q`OH5oaHDz=hYQ(mVy2e$0w>`G=Hw)P16PD z)m+#Ef!g4)+DA1vy@&&N&qq6OR)p*TI1#Z<`N!k{CFy(s@vG}O2kk+CA%P38Dw8Pn z$cGA|z_0=)zgB~vfGCD#4Do(YFe|IW?API|FV2PnHt6K)P)UH+BuCrhy0DaKANA_| zBrVmyVsSqb9XYg~5nH`@Vcz54m3-b{?vAaZ%UJ#hDV5--VrR_jumT3Z?^OzDT$q6| zZzXZ5sm)2fqeeXZr!7LCl#5Gi7>Z!?Ev&e>Zdua5C1-hjJsN4O_=f)A)wd}L{4DKV z;^Yd!{8wil-uH8Xp|XYXBJ+?WLRsBtn9o$T#DkKGP^^L)sKfd+kd?~uUd;JLQ%8e6 ziHb+J(s6pU?kq_p&4EX+B690A`A7WN`j+|JdBc)34VAJDhqDDoUurUPEGxZ2R0!^&$g~f?fJ6LT4qt4RmDV3uZk>7@Kc?v`5DbTm`gb-jH+9+17pfr z$>b~RSO%w(2`*oOtFi<2$!{*!zQP#P1d6Pzi5>fX1!g_(#2D44VT~V$8grxSD4YJM zSP-4Hhh>ltcqQvuDH7Ewrz^NWi6i*R8TGuyxT2A4{7siY+qjmWags81P{%1N| zSstj`dNq^uT5JI0!Pqk8f9GW=6I4nMeixYT_k~BRt0imj_jROAt1W|xv+1J#OyruW zrY+*+zM0Sia}3|#N&H8*ZT!UFTJ#(K?k5J^cwE~92H-f^f!vn}JRCE4_cqYGIs&#@ zF71hoC z1tyInJc-! zz{b|~Ji3NM5Jy^2zF$F#^lWWw`e$p?9!89%0t**n<^^* z;x`Urp5LSwHH6wwqq3R+`7qSjYi$RjNb^TpSrY7@ErZaD9d~Fb1NoJ~@_xiOiz`RZ8fGek_>?9Eig!a7bAo~^1}wKex(c<|M_X7o;fpFR z;cTjL9%4Zx9rf0fg~KMiL)qs!VrS+1&v{s_!Y$r>MFK;-+egDq2%^kvKACb~yU((_ zjTeG$9n!)9cb}_-$A>R{o*E&X+mu3!jdn}HA9VXYEj*r`nfSBwm(OPlu_DuZu$CvK z)+XcNH>L~m7Mb`*tvoCrt{m+t9pyerpYC3NY+c@5y_bo_Rf(m(-Dp5%A-lSGEXkp! z=Fx}IaL#IZQMc0Z@5$R?nK<)nRrG4Oh7gA-A3@v(GE7G?Q2HaVSM7rz_oim zlVMk?WwYXA7uL6YvtF?W(Y_)+B3sFwa^u?S+>v2K*6g=)mWsO&HDnDK5;^EcL+KO* z%pU{$kVS1lol`!fb4A`!Gs{wiU&3;6ao$(O`6Zzv0BGmsi|4XjVVpUzu0flk&0{h? zkQi=2ga8i(rG}yP+ttcxwgkqJcVP9>`1o{>%94v%hKiG+@VYhvNR%WcFBN3uW%hs# zc#27D46DHEOjPQ8;9Vs_5MN$s^XEi`rg~_C$Rgf zzT0}r8^9N4=r&r((6bmOjTVuuYgy@05-R(b|)nO z-WMpYqfEWS({^VV>}!RwN}9G(6Z{HL>dI{Q4vj#<(11!ZSv7&~X}qg(4ru7koSe5K z_RX`zK%vY#l^nee}L=YK1wiJ&u7R!vL|^Wy6ck2fXJ z0ez0e62U%|h#|Y`1#ZT1f6d9vgzP2T8(2}oHf!LNWx5eF=H}*dNk1n)a{^8C6m!tb zSpDGm|8J7_&5=AS-tV}qIy|#xt(ud^dZ$s`jWW8*E498HC*;w!2vA%_+OHfmTu2M~ z7bEB))7B!~J|g))_^s%#U-%TG&1Iw?((1f7KX#%`_490~CeXwy?=_LYgK#B&?@#gL z{LG&cJl%jVI)hXUkr)$)rH0~E(i(&_{-#}j)CrCX$m%nHHB%2VAK&Yw=det}J + app:gemDrawable="@drawable/gems_84" + app:showSeedsPromo="true" /> + android:gravity="center" + android:layout_marginBottom="14dp" /> + +