diff --git a/.gitignore b/.gitignore index b1df87bc..bf20b149 100644 --- a/.gitignore +++ b/.gitignore @@ -26,17 +26,18 @@ local.properties *.iml *.ipr *.iws -**/.idea/shelf -**/.idea/workspace.xml -**/.idea/tasks.xml -**/.idea/datasources.xml -**/.idea/dataSources.ids -**/.idea/gradle.xml -**/.idea/misc.xml -**/.idea/modules.xml -**/.idea/libraries -**/.idea/dictionaries -**/.idea/runConfigurations.xml +**/.idea/ + +# IDEA/Android Studio Ignore exceptions +!/.idea/vcs.xml +!/.idea/fileTemplates/ +!/.idea/inspectionProfiles/ +!/.idea/scopes/ +!/.idea/codeStyleSettings.xml +!/.idea/.name +!/.idea/encodings.xml +!/.idea/copyright/ +!/.idea/compiler.xml # OSX *.DS_Store diff --git a/.travis.yml b/.travis.yml index 92a01e4c..00bc6e22 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ android: - tools # The BuildTools version used by your project - - build-tools-25.0.0 + - build-tools-25.0.2 # The SDK version used to compile your project - android-25 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 00000000..c7f08f8a --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,6 @@ +Connfa is brought to you by: + + * [Lemberg Solutions](http://lemberg.co.uk) - [@lemberg](https://github.com/lemberg) + * Sebastiano Poggi - [@rock3r](https://github.com/rock3r) + * Francesco Pontillo - [@frapontillo](https://github.com/frapontillo) + * Roberto Orgiu - [@tiwiz](https://github.com/tiwiz) diff --git a/README.md b/README.md index d2891814..89b4dc44 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ -Documentation is available on [http://connfa.com/](http://connfa.com/) +# Connfa -Project is supported by [Lemberg Solutions](http://lemberg.co.uk) +Connfa is an open source platform for conferences to provide web and native apps to their attendees. Documentation is available on [http://connfa.com/](http://connfa.com/). The project is supported by [Lemberg Solutions](http://lemberg.co.uk) and by independent contributors (see CONTRIBUTORS.md). + +# Setting up the app + +See [`docs/setup.md`](docs/setup.md). diff --git a/app/build.gradle b/app/build.gradle index 3a40d76d..2251f68f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,3 @@ -apply from: '../dependencies.gradle' - buildscript { repositories { maven { url 'https://maven.fabric.io/public' } @@ -72,6 +70,10 @@ android { .or(buildProperties.env['BASE_URL']) .string + resValueString 'social_query', buildProperties.application['socialQuery'] + .or('#AndroidDev') + .string + } if (System.getenv('CI') == null) { @@ -97,6 +99,8 @@ android { } dependencies { + compile project(':drupalSDK') + compile libraries.app.annotations compile libraries.app.gson compile libraries.app.volley @@ -114,8 +118,7 @@ dependencies { compile(libraries.app.crashlytics) { transitive = true } - compile project(':drupalSDK') - compile libraries.app.twitter + compile libraries.app.tweetUi } apply plugin: 'com.google.gms.google-services' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa9c8e01..4d580d48 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ @@ -31,23 +31,29 @@ + + diff --git a/app/src/main/java/com/connfa/ConnfaApplication.java b/app/src/main/java/com/connfa/ConnfaApplication.java index c06bcdf0..ac7b8166 100644 --- a/app/src/main/java/com/connfa/ConnfaApplication.java +++ b/app/src/main/java/com/connfa/ConnfaApplication.java @@ -10,8 +10,9 @@ import com.ls.drupal.DrupalClient; import com.ls.http.base.BaseRequest; import com.ls.util.image.DrupalImageView; -import com.twitter.sdk.android.Twitter; import com.twitter.sdk.android.core.TwitterAuthConfig; +import com.twitter.sdk.android.core.TwitterCore; +import com.twitter.sdk.android.tweetui.TweetUi; import io.fabric.sdk.android.Fabric; import timber.log.Timber; @@ -55,6 +56,6 @@ private void setupFabric() { getString(R.string.api_value_twitter_api_key), getString(R.string.api_value_twitter_secret) ); - Fabric.with(this, new Crashlytics(), new Twitter(authConfig)); + Fabric.with(this, new Crashlytics(), new TwitterCore(authConfig), new TweetUi()); } } diff --git a/app/src/main/java/com/connfa/model/UpdatesManager.java b/app/src/main/java/com/connfa/model/UpdatesManager.java index aaf54cfe..43f46fbd 100644 --- a/app/src/main/java/com/connfa/model/UpdatesManager.java +++ b/app/src/main/java/com/connfa/model/UpdatesManager.java @@ -49,11 +49,11 @@ public class UpdatesManager { public static int convertEventIdToEventModePos(int eventModePos) { switch (eventModePos) { case PROGRAMS_REQUEST_ID: - return DrawerManager.EventMode.Program.ordinal(); + return DrawerManager.EventMode.PROGRAM.ordinal(); case BOFS_REQUEST_ID: - return DrawerManager.EventMode.Bofs.ordinal(); + return DrawerManager.EventMode.BOFS.ordinal(); case SOCIALS_REQUEST_ID: - return DrawerManager.EventMode.Social.ordinal(); + return DrawerManager.EventMode.SOCIAL.ordinal(); } return 0; } diff --git a/app/src/main/java/com/connfa/model/dao/EventDao.java b/app/src/main/java/com/connfa/model/dao/EventDao.java index 86f1cdc7..d4e63806 100644 --- a/app/src/main/java/com/connfa/model/dao/EventDao.java +++ b/app/src/main/java/com/connfa/model/dao/EventDao.java @@ -368,7 +368,7 @@ public List getEventsBySpeakerId(long speakerId) { event.setEventName(cursor.getString(cursor.getColumnIndex("_name"))); event.setLevelName(cursor.getString(cursor.getColumnIndex("level_name"))); event.setTrackName(cursor.getString(cursor.getColumnIndex("track_name"))); - event.setDate(getContext(), cursor.getLong(cursor.getColumnIndex( "_date"))); + event.setDate(getContext(), cursor.getLong(cursor.getColumnIndex("_date"))); event.setFavorite(cursor.getInt(cursor.getColumnIndex("_favorite")) == 1); event.setPlace(cursor.getString(cursor.getColumnIndex("_place"))); diff --git a/app/src/main/java/com/connfa/model/database/AbstractEntityDAO.java b/app/src/main/java/com/connfa/model/database/AbstractEntityDAO.java index fe2ce877..0e65e6c7 100644 --- a/app/src/main/java/com/connfa/model/database/AbstractEntityDAO.java +++ b/app/src/main/java/com/connfa/model/database/AbstractEntityDAO.java @@ -53,7 +53,7 @@ private boolean containsData(E entity) { public final int deleteData(I entity) { ILAPIDBFacade facade = getFacade(); return facade.delete(getTableName(), getSearchCondition(), - getSearchConditionArguments(entity) + getSearchConditionArguments(entity) ); } @@ -64,7 +64,7 @@ public final int deleteDataSafe(I entity) { facade.open(); return facade.delete(getTableName(), getSearchCondition(), - getSearchConditionArguments(entity) + getSearchConditionArguments(entity) ); } finally { facade.close(); @@ -110,7 +110,7 @@ private List getData(String condition, String[] arguments) { ILAPIDBFacade facade = getFacade(); Cursor cursor = facade.getAllRecords(getTableName(), null, - condition, arguments + condition, arguments ); boolean moved = cursor.moveToFirst(); @@ -293,7 +293,7 @@ private int updateData(E entity) { ILAPIDBFacade facade = getFacade(); return facade.update(getTableName(), getSearchCondition(), - getSearchConditionArguments(entity.getId()), values + getSearchConditionArguments(entity.getId()), values ); } diff --git a/app/src/main/java/com/connfa/model/database/DatabaseFacade.java b/app/src/main/java/com/connfa/model/database/DatabaseFacade.java index 22144ef7..25816df9 100644 --- a/app/src/main/java/com/connfa/model/database/DatabaseFacade.java +++ b/app/src/main/java/com/connfa/model/database/DatabaseFacade.java @@ -14,7 +14,7 @@ class DatabaseFacade implements ILAPIDBFacade { private final Context context; private int openCounter = 0; - + DatabaseFacade(Context context, DBInfo dbInfo) { this.context = context; this.dbInfo = dbInfo; @@ -136,26 +136,26 @@ public int clearTable(String table) { public Cursor getAllRecords(String table, String[] columns, String selection) { return db.query(true, - table, - columns, - selection,// selection - null,// selection args - null,// groupBy - null,// having - null,// order by - null); + table, + columns, + selection,// selection + null,// selection args + null,// groupBy + null,// having + null,// order by + null); } public Cursor getAllRecords(String table, String[] columns, String selection, String[] selectionArgs) { return db.query(true, - table, - columns, - selection,// selection - selectionArgs,// selection args - null,// groupBy - null,// having - null,// order by - null); + table, + columns, + selection,// selection + selectionArgs,// selection args + null,// groupBy + null,// having + null,// order by + null); } public String getQuery(int resId) { diff --git a/app/src/main/java/com/connfa/receiver/NotifyReceiver.java b/app/src/main/java/com/connfa/receiver/NotifyReceiver.java index 51db329f..dee9d899 100644 --- a/app/src/main/java/com/connfa/receiver/NotifyReceiver.java +++ b/app/src/main/java/com/connfa/receiver/NotifyReceiver.java @@ -9,22 +9,39 @@ import android.support.v4.app.NotificationCompat; import com.connfa.R; +import com.connfa.model.Model; +import com.connfa.model.data.EventDetailsEvent; +import com.connfa.model.data.Speaker; +import com.connfa.model.managers.EventManager; +import com.connfa.model.managers.SpeakerManager; import com.connfa.ui.activity.EventDetailsActivity; import com.connfa.ui.activity.HomeActivity; import com.connfa.utils.AlarmTask; +import java.util.List; + +import static android.R.attr.id; + public class NotifyReceiver extends BroadcastReceiver { @Override - public void onReceive(Context context, Intent intent) { - long eventId = intent.getLongExtra(AlarmTask.EXTRA_ID, -1); - long day = intent.getLongExtra(AlarmTask.EXTRA_DAY, -1); - String text = intent.getStringExtra(AlarmTask.EXTRA_TEXT); - showNotification(context, eventId, day, text); + public void onReceive(final Context context, Intent intent) { + long eventId = intent.getLongExtra(AlarmTask.EXTRA_ID, -1); + long day = intent.getLongExtra(AlarmTask.EXTRA_DAY, -1); + + SpeakerManager speakerManager = Model.getInstance().getSpeakerManager(); + List speakerList = speakerManager.getSpeakersByEventId(eventId); + + EventManager eventManager = Model.getInstance().getEventManager(); + EventDetailsEvent event = eventManager.getEventById(eventId); + if (event != null) { + showNotification(context, event, speakerList, day); + } + } - private void showNotification(Context context, long id, long day, String text) { - String title = context.getString(R.string.dont_miss_it); + private void showNotification(Context context, EventDetailsEvent event, List speakerList, long day) { + String title = event.getEventName(); int icon = android.R.drawable.ic_dialog_info; Intent intent = new Intent(context, HomeActivity.class); @@ -32,15 +49,54 @@ private void showNotification(Context context, long id, long day, String text) { intent.putExtra(EventDetailsActivity.EXTRA_DAY, day); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - NotificationCompat.Builder builder = new NotificationCompat.Builder(context); - builder.setSmallIcon(icon); - builder.setContentTitle(title); - builder.setContentText(text); - builder.setAutoCancel(true); - builder.setContentIntent(contentIntent); - builder.setDefaults(Notification.DEFAULT_ALL); + NotificationCompat.Builder builder = new NotificationCompat.Builder(context) + .setSmallIcon(icon) + .setContentTitle(title) + .setContentText(createContentText(context, event)) + .setAutoCancel(true) + .setContentIntent(contentIntent) + .setStyle(new NotificationCompat.BigTextStyle() + .bigText(createBigText(context, event, speakerList))) + .setDefaults(Notification.DEFAULT_ALL); NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(0, builder.build()); } + + private CharSequence createContentText(Context context, EventDetailsEvent event) { + return context.getString(R.string.start_in_5_minutes_in_place, event.getPlace()); + } + + private CharSequence createBigText(Context context, EventDetailsEvent event, List speakerList) { + String speakersNames = createSpeakersNames(speakerList); + return context.getString(R.string.start_in_5_minutes_in_place_speakers, event.getPlace(), speakersNames); + } + + private String createSpeakersNames(List speakerList) { + if (speakerList.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder("by "); + for (int i = 0; i < speakerList.size(); i++) { + sb.append(createSpeakerFullName(speakerList.get(i))); + if (isBeforeSecondToLast(speakerList, i)) { + sb.append(", "); + } else if (isSecondToLast(speakerList, i)) { + sb.append(" and "); + } + } + return sb.toString(); + } + + private boolean isBeforeSecondToLast(List speakerList, int i) { + return i < speakerList.size() - 2; + } + + private boolean isSecondToLast(List speakerList, int i) { + return i == speakerList.size() - 2; + } + + private String createSpeakerFullName(Speaker speaker) { + return speaker.getFirstName() + " " + speaker.getLastName(); + } } diff --git a/app/src/main/java/com/connfa/social/SocialFeedActivity.java b/app/src/main/java/com/connfa/social/SocialFeedActivity.java new file mode 100644 index 00000000..b21b1f3e --- /dev/null +++ b/app/src/main/java/com/connfa/social/SocialFeedActivity.java @@ -0,0 +1,98 @@ +package com.connfa.social; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.widget.ListView; + +import com.connfa.R; +import com.connfa.analytics.Analytics; +import com.twitter.sdk.android.core.Callback; +import com.twitter.sdk.android.core.Result; +import com.twitter.sdk.android.core.TwitterException; +import com.twitter.sdk.android.core.models.Tweet; +import com.twitter.sdk.android.tweetui.SearchTimeline; +import com.twitter.sdk.android.tweetui.TimelineResult; +import com.twitter.sdk.android.tweetui.TweetTimelineListAdapter; + +import timber.log.Timber; + +public class SocialFeedActivity extends AppCompatActivity { + + private Analytics analytics; + + private ListView tweetsList; + private TweetTimelineListAdapter tweetsAdapter; + private SwipeRefreshLayout swipeLayout; + private boolean refreshingData; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + analytics = Analytics.from(this); + + setContentView(R.layout.activity_social_feed); + + setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); + + SearchTimeline timeline = new SearchTimeline.Builder() + .query(getString(R.string.social_query)) + .build(); + + tweetsAdapter = new TweetTimelineListAdapter.Builder(this) + .setTimeline(timeline) + .build(); + + tweetsList = (ListView) findViewById(R.id.list); + tweetsList.setAdapter(tweetsAdapter); + + swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_container); + + swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + if (refreshingData) { + Timber.i("Timeline refresh already underway, ignoring new refresh request"); + return; + } + refreshTimeline(); + } + }); + } + + @Override + protected void onStart() { + super.onStart(); + analytics.trackEvent("Social Feed screen", getString(R.string.action_open)); + } + + private void refreshTimeline() { + swipeLayout.setRefreshing(true); + refreshingData = true; + tweetsAdapter.refresh(new TimelineLoadingCallback()); + } + + private void onRefreshFinished() { + refreshingData = false; + swipeLayout.setRefreshing(false); + } + + private class TimelineLoadingCallback extends Callback> { + + @Override + public void success(Result> result) { + onRefreshFinished(); + } + + @Override + public void failure(TwitterException exception) { + onRefreshFinished(); + Timber.e(exception, "Error while refreshing the timeline."); + // TODO show empty state + } + + } +} diff --git a/app/src/main/java/com/connfa/ui/activity/AboutDetailsActivity.java b/app/src/main/java/com/connfa/ui/activity/AboutDetailsActivity.java index c4f53e34..83e2bd19 100644 --- a/app/src/main/java/com/connfa/ui/activity/AboutDetailsActivity.java +++ b/app/src/main/java/com/connfa/ui/activity/AboutDetailsActivity.java @@ -72,7 +72,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { } private void initToolbar(String title) { - Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { toolbar.setTitle(title); setSupportActionBar(toolbar); diff --git a/app/src/main/java/com/connfa/ui/activity/EventDetailsActivity.java b/app/src/main/java/com/connfa/ui/activity/EventDetailsActivity.java index 3a38ab03..9cd3e24c 100644 --- a/app/src/main/java/com/connfa/ui/activity/EventDetailsActivity.java +++ b/app/src/main/java/com/connfa/ui/activity/EventDetailsActivity.java @@ -147,7 +147,7 @@ private void initToolbar() { mToolbarTitle.setAlpha(0f); mViewToolbar.setAlpha(0f); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { toolbar.setTitle(""); setSupportActionBar(toolbar); diff --git a/app/src/main/java/com/connfa/ui/activity/HomeActivity.java b/app/src/main/java/com/connfa/ui/activity/HomeActivity.java index ab3623c1..9f4e90a9 100644 --- a/app/src/main/java/com/connfa/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/connfa/ui/activity/HomeActivity.java @@ -19,6 +19,7 @@ import com.connfa.model.data.Level; import com.connfa.model.data.Track; import com.connfa.model.managers.TracksManager; +import com.connfa.social.SocialFeedActivity; import com.connfa.ui.adapter.item.EventListItem; import com.connfa.ui.dialog.FilterDialog; import com.connfa.ui.dialog.IrrelevantTimezoneDialogFragment; @@ -125,7 +126,7 @@ public void onNewFilterApplied() { private void initToolbar() { mPresentTitle = getString(DrawerMenu.MENU_STRING_RES_ARRAY[0]); - mToolbar = (Toolbar) findViewById(R.id.toolBar); + mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar.setTitle(mPresentTitle); setSupportActionBar(mToolbar); } @@ -258,7 +259,9 @@ private void onItemClick(int position) { private void changeFragment() { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); DrawerMenuItem item = mAdapter.getItem(mSelectedItem); - if (!item.isGroup() && mFrManager != null) { + if (isSocialFeedAt(mSelectedItem)) { + startActivity(new Intent(this, SocialFeedActivity.class)); + } else if (!item.isGroup() && mFrManager != null) { mFrManager.setFragment(DrawerMenu.DrawerItem.values()[mSelectedItem]); mPresentTitle = getString(DrawerMenu.MENU_STRING_RES_ARRAY[mSelectedItem]); mToolbar.setTitle(mPresentTitle); @@ -266,12 +269,16 @@ private void changeFragment() { mAdapter.setSelectedPos(mSelectedItem); mAdapter.notifyDataSetChanged(); - analytics.trackEvent(mPresentTitle + " screen", this.getString(R.string.action_open)); + analytics.trackEvent(mPresentTitle + " screen", getString(R.string.action_open)); } } + private boolean isSocialFeedAt(int position) { + return DrawerMenu.DrawerItem.values()[mSelectedItem] == DrawerMenu.DrawerItem.SOCIAL_MEDIA; + } + private void initFragmentManager() { - mFrManager = DrawerManager.getInstance(getSupportFragmentManager(), R.id.mainFragment); + mFrManager = new DrawerManager(getSupportFragmentManager(), R.id.fragment_container); analytics.trackEvent(getString(R.string.Sessions) + " screen", getString(R.string.action_open)); mFrManager.setFragment(DrawerMenu.DrawerItem.PROGRAM); } diff --git a/app/src/main/java/com/connfa/ui/activity/SpeakerDetailsActivity.java b/app/src/main/java/com/connfa/ui/activity/SpeakerDetailsActivity.java index 1fd38361..bf1ba978 100644 --- a/app/src/main/java/com/connfa/ui/activity/SpeakerDetailsActivity.java +++ b/app/src/main/java/com/connfa/ui/activity/SpeakerDetailsActivity.java @@ -111,7 +111,7 @@ private void initData() { } private void initToolbar() { - Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { toolbar.setTitle(""); setSupportActionBar(toolbar); diff --git a/app/src/main/java/com/connfa/ui/adapter/BaseEventDaysPagerAdapter.java b/app/src/main/java/com/connfa/ui/adapter/BaseEventDaysPagerAdapter.java index d173f08f..18b63b70 100644 --- a/app/src/main/java/com/connfa/ui/adapter/BaseEventDaysPagerAdapter.java +++ b/app/src/main/java/com/connfa/ui/adapter/BaseEventDaysPagerAdapter.java @@ -28,20 +28,20 @@ public BaseEventDaysPagerAdapter(Context context, FragmentManager fm) { @Override public Fragment getItem(int position) { Long date = getDate(position); - Fragment fragment = EventFragment.newInstance(DrawerManager.EventMode.Program.ordinal(), date); + Fragment fragment = EventFragment.newInstance(DrawerManager.EventMode.PROGRAM.ordinal(), date); switch (mEventMode) { - case Program: - fragment = EventFragment.newInstance(DrawerManager.EventMode.Program.ordinal(), date); + case PROGRAM: + fragment = EventFragment.newInstance(DrawerManager.EventMode.PROGRAM.ordinal(), date); break; - case Bofs: - fragment = EventFragment.newInstance(DrawerManager.EventMode.Bofs.ordinal(), date); + case BOFS: + fragment = EventFragment.newInstance(DrawerManager.EventMode.BOFS.ordinal(), date); break; - case Social: - fragment = EventFragment.newInstance(DrawerManager.EventMode.Social.ordinal(), date); + case SOCIAL: + fragment = EventFragment.newInstance(DrawerManager.EventMode.SOCIAL.ordinal(), date); break; - case Favorites: - fragment = EventFragment.newInstance(DrawerManager.EventMode.Favorites.ordinal(), date); + case FAVORITES: + fragment = EventFragment.newInstance(DrawerManager.EventMode.FAVORITES.ordinal(), date); break; } return fragment; diff --git a/app/src/main/java/com/connfa/ui/adapter/EventsAdapter.java b/app/src/main/java/com/connfa/ui/adapter/EventsAdapter.java index 222537df..bafca5d6 100644 --- a/app/src/main/java/com/connfa/ui/adapter/EventsAdapter.java +++ b/app/src/main/java/com/connfa/ui/adapter/EventsAdapter.java @@ -312,7 +312,7 @@ private void fillDivider(EventHolder holder, boolean isFirst) { } private void fillFavorite(EventHolder holder) { - if (mEventMode == DrawerManager.EventMode.Favorites) { + if (mEventMode == DrawerManager.EventMode.FAVORITES) { holder.layoutTime.setBackgroundColor(Color.TRANSPARENT); } else { holder.layoutTime.setBackgroundColor(context.getResources().getColor(R.color.grey_400_trans)); diff --git a/app/src/main/java/com/connfa/ui/drawer/DrawerManager.java b/app/src/main/java/com/connfa/ui/drawer/DrawerManager.java index 840722a7..5df2e249 100644 --- a/app/src/main/java/com/connfa/ui/drawer/DrawerManager.java +++ b/app/src/main/java/com/connfa/ui/drawer/DrawerManager.java @@ -1,5 +1,6 @@ package com.connfa.ui.drawer; +import android.support.annotation.IdRes; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; @@ -15,26 +16,30 @@ public class DrawerManager { - public enum EventMode {Program, Bofs, Social, Speakers, Favorites, Location, About} + public enum EventMode { + PROGRAM, + BOFS, + SOCIAL, + SPEAKERS, + FAVORITES, + LOCATION, + ABOUT + } private FragmentManager fragmentManager; private int fragmentHolderId; private EventMode currentEventMode; - public static DrawerManager getInstance(FragmentManager theFragmentManager, int theMainFragmentId) { - return new DrawerManager(theFragmentManager, theMainFragmentId); - } - - private DrawerManager(FragmentManager theFragmentManager, int theMainFragmentId) { - this.fragmentManager = theFragmentManager; - this.fragmentHolderId = theMainFragmentId; + public DrawerManager(FragmentManager fragmentManager, @IdRes int fragmentContainerResId) { + this.fragmentManager = fragmentManager; + this.fragmentHolderId = fragmentContainerResId; } - public void setFragment(@NotNull DrawerMenu.DrawerItem mode) { + public void setFragment(@NotNull DrawerMenu.DrawerItem drawerItem) { Fragment fragment; String fragmentTag = null; - switch (mode) { + switch (drawerItem) { case PROGRAM: fragment = EventHolderFragment.newInstance(DrawerMenu.DrawerItem.PROGRAM.ordinal()); fragmentTag = EventHolderFragment.TAG; @@ -78,14 +83,14 @@ public void setFragment(@NotNull DrawerMenu.DrawerItem mode) { fragmentTag = SocialMediaFragment.TAG; break; default: - fragment = EventHolderFragment.newInstance(EventMode.Program.ordinal()); + fragment = EventHolderFragment.newInstance(EventMode.PROGRAM.ordinal()); } fragmentManager.beginTransaction().replace(fragmentHolderId, fragment, fragmentTag).commit(); } - public void reloadPrograms(@NotNull DrawerMenu.DrawerItem mode) { + public void reloadPrograms(@NotNull DrawerMenu.DrawerItem drawerItem) { Fragment fragment; - switch (mode) { + switch (drawerItem) { case PROGRAM: fragment = EventHolderFragment.newInstance(DrawerMenu.DrawerItem.PROGRAM.ordinal()); break; @@ -98,7 +103,7 @@ public void reloadPrograms(@NotNull DrawerMenu.DrawerItem mode) { fragment = EventHolderFragment.newInstance(DrawerMenu.DrawerItem.SOCIAL.ordinal()); break; default: - fragment = EventHolderFragment.newInstance(EventMode.Program.ordinal()); + fragment = EventHolderFragment.newInstance(EventMode.PROGRAM.ordinal()); } FragmentTransaction ft = fragmentManager.beginTransaction(); ft.replace(fragmentHolderId, fragment, EventHolderFragment.TAG); diff --git a/app/src/main/java/com/connfa/ui/drawer/DrawerMenuItem.java b/app/src/main/java/com/connfa/ui/drawer/DrawerMenuItem.java index b5ce0c50..b796a53e 100644 --- a/app/src/main/java/com/connfa/ui/drawer/DrawerMenuItem.java +++ b/app/src/main/java/com/connfa/ui/drawer/DrawerMenuItem.java @@ -1,6 +1,7 @@ package com.connfa.ui.drawer; public class DrawerMenuItem { + private long id; private String name; private int iconRes; diff --git a/app/src/main/java/com/connfa/ui/fragment/CustomMapFragment.java b/app/src/main/java/com/connfa/ui/fragment/CustomMapFragment.java index e1dac034..ce6c0d6f 100644 --- a/app/src/main/java/com/connfa/ui/fragment/CustomMapFragment.java +++ b/app/src/main/java/com/connfa/ui/fragment/CustomMapFragment.java @@ -12,6 +12,7 @@ public interface OnActivityCreatedListener { void onActivityCreated(GoogleMap googleMap); } + private OnActivityCreatedListener mListener; public static CustomMapFragment newInstance(OnActivityCreatedListener listener) { diff --git a/app/src/main/java/com/connfa/ui/fragment/EventFragment.java b/app/src/main/java/com/connfa/ui/fragment/EventFragment.java index 31dd4039..667301e1 100644 --- a/app/src/main/java/com/connfa/ui/fragment/EventFragment.java +++ b/app/src/main/java/com/connfa/ui/fragment/EventFragment.java @@ -50,7 +50,7 @@ public class EventFragment extends Fragment implements EventsAdapter.Listener { new ReceiverManager.FavoriteUpdatedListener() { @Override public void onFavoriteUpdated(long eventId, boolean isFavorite) { - if (eventMode != DrawerManager.EventMode.Favorites) { + if (eventMode != DrawerManager.EventMode.FAVORITES) { new LoadData().execute(); } } @@ -95,7 +95,7 @@ public void onDestroy() { private void initData() { Bundle bundle = getArguments(); if (bundle != null) { - int eventPost = bundle.getInt(EXTRAS_ARG_MODE, DrawerManager.EventMode.Program.ordinal()); + int eventPost = bundle.getInt(EXTRAS_ARG_MODE, DrawerManager.EventMode.PROGRAM.ordinal()); eventMode = DrawerManager.EventMode.values()[eventPost]; day = bundle.getLong(EXTRAS_ARG_DAY, 0); @@ -147,16 +147,16 @@ private List getEventItems() { List eventList = new ArrayList<>(); switch (eventMode) { - case Program: + case PROGRAM: eventList.addAll(generator.generate(day, Event.PROGRAM_CLASS, levelIds, trackIds, new SimpleTimeRangeCreator())); break; - case Bofs: + case BOFS: eventList.addAll(generator.generate(day, Event.BOFS_CLASS, levelIds, trackIds, new SimpleTimeRangeCreator())); break; - case Social: + case SOCIAL: eventList.addAll(generator.generate(day, Event.SOCIALS_CLASS, levelIds, trackIds, new SimpleTimeRangeCreator())); break; - case Favorites: + case FAVORITES: eventList.addAll(generator.generateForFavorites(day, new SimpleTimeRangeCreator())); break; } @@ -169,7 +169,7 @@ private void handleEventsResult(List eventListItems) { } adapter.setData(eventListItems, eventMode); - if (DateUtils.isToday(getActivity(), day) && eventMode != DrawerManager.EventMode.Favorites) { + if (DateUtils.isToday(getActivity(), day) && eventMode != DrawerManager.EventMode.FAVORITES) { int index = getCurrentTimePosition(eventListItems); listView.setSelection(index); } diff --git a/app/src/main/java/com/connfa/ui/fragment/EventHolderFragment.java b/app/src/main/java/com/connfa/ui/fragment/EventHolderFragment.java index 0b5629a5..c5943b96 100644 --- a/app/src/main/java/com/connfa/ui/fragment/EventHolderFragment.java +++ b/app/src/main/java/com/connfa/ui/fragment/EventHolderFragment.java @@ -2,9 +2,9 @@ import android.app.Activity; import android.graphics.Typeface; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.Menu; @@ -20,46 +20,38 @@ import com.connfa.model.Model; import com.connfa.model.PreferencesManager; import com.connfa.model.UpdatesManager; -import com.connfa.model.managers.BofsManager; -import com.connfa.model.managers.FavoriteManager; -import com.connfa.model.managers.ProgramManager; -import com.connfa.model.managers.SocialManager; import com.connfa.ui.activity.HomeActivity; import com.connfa.ui.adapter.BaseEventDaysPagerAdapter; import com.connfa.ui.drawer.DrawerManager; import com.connfa.ui.receiver.ReceiverManager; import com.connfa.utils.DateUtils; -import java.util.ArrayList; import java.util.List; -import org.jetbrains.annotations.NotNull; +import timber.log.Timber; public class EventHolderFragment extends Fragment { public static final String TAG = "ProjectsFragment"; + private static final String EXTRAS_ARG_MODE = "EXTRAS_ARG_MODE"; + private LoadDataTask loadDataTask; + private PreferencesManager preferencesManager; - private ViewPager mViewPager; - private PagerSlidingTabStrip mPagerTabs; - private BaseEventDaysPagerAdapter mAdapter; + private ViewPager viewPager; + private PagerSlidingTabStrip tabStrip; + private BaseEventDaysPagerAdapter adapter; - private DrawerManager.EventMode mEventMode; + private DrawerManager.EventMode eventMode; - private View mLayoutPlaceholder; - private ImageView mImageViewNoContent; - private TextView mTextViewNoContent; + private View layoutPlaceholder; + private ImageView emptyImageView; + private TextView emptyLabel; - private boolean mIsFilterUsed; + private boolean isFilterUsed; - private UpdatesManager.DataUpdatedListener updateReceiver = new UpdatesManager.DataUpdatedListener() { - @Override - public void onDataUpdated(List requestIds) { - updateData(requestIds); - } - }; private ReceiverManager favoriteReceiver = new ReceiverManager(new ReceiverManager.FavoriteUpdatedListener() { @Override public void onFavoriteUpdated(long eventId, boolean isFavorite) { @@ -108,25 +100,6 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; } -// @Override -// public void onActivityCreated(Bundle savedInstanceState) { -// super.onActivityCreated(savedInstanceState); -// Model.createInstance().getUpdatesManager().registerUpdateListener(updateReceiver); -// favoriteReceiver.register(getActivity()); -// -// initData(); -// initView(); -// new LoadData().execute(); -// } -// -// -// @Override -// public void onDestroy() { -// super.onDestroy(); -// Model.createInstance().getUpdatesManager().unregisterUpdateListener(updateReceiver); -// favoriteReceiver.unregister(getActivity()); -// } - @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -135,7 +108,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) { initData(); initView(); - new LoadData().execute(); + refreshData(); } @Override @@ -145,11 +118,18 @@ public void onDestroyView() { super.onDestroyView(); } + private UpdatesManager.DataUpdatedListener updateReceiver = new UpdatesManager.DataUpdatedListener() { + @Override + public void onDataUpdated(List requestIds) { + updateData(requestIds); + } + }; + private void initData() { Bundle bundle = getArguments(); if (bundle != null) { - int eventPos = bundle.getInt(EXTRAS_ARG_MODE, DrawerManager.EventMode.Program.ordinal()); - mEventMode = DrawerManager.EventMode.values()[eventPos]; + int eventPos = bundle.getInt(EXTRAS_ARG_MODE, DrawerManager.EventMode.PROGRAM.ordinal()); + eventMode = DrawerManager.EventMode.values()[eventPos]; } } @@ -159,172 +139,155 @@ private void initView() { return; } - mAdapter = new BaseEventDaysPagerAdapter(getActivity(), getChildFragmentManager()); - mViewPager = (ViewPager) view.findViewById(R.id.viewPager); - mViewPager.setAdapter(mAdapter); + adapter = new BaseEventDaysPagerAdapter(getActivity(), getChildFragmentManager()); + viewPager = (ViewPager) view.findViewById(R.id.viewPager); + viewPager.setAdapter(adapter); Typeface typeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Roboto-Regular.ttf"); - mPagerTabs = (PagerSlidingTabStrip) getView().findViewById(R.id.pager_tab_strip); - mPagerTabs.setTypeface(typeface, 0); - mPagerTabs.setViewPager(mViewPager); + tabStrip = (PagerSlidingTabStrip) getView().findViewById(R.id.pager_tab_strip); + tabStrip.setTypeface(typeface, 0); + tabStrip.setViewPager(viewPager); - mLayoutPlaceholder = view.findViewById(R.id.layout_placeholder); - mTextViewNoContent = (TextView) view.findViewById(R.id.text_view_placeholder); - mImageViewNoContent = (ImageView) view.findViewById(R.id.image_view_placeholder); + layoutPlaceholder = view.findViewById(R.id.layout_placeholder); + emptyLabel = (TextView) view.findViewById(R.id.text_view_placeholder); + emptyImageView = (ImageView) view.findViewById(R.id.image_view_placeholder); - if (mEventMode == DrawerManager.EventMode.Program || - mEventMode == DrawerManager.EventMode.Bofs || - mEventMode == DrawerManager.EventMode.Social) { + if (eventMode == DrawerManager.EventMode.PROGRAM || + eventMode == DrawerManager.EventMode.BOFS || + eventMode == DrawerManager.EventMode.SOCIAL) { setHasOptionsMenu(true); } else { setHasOptionsMenu(false); } } - class LoadData extends AsyncTask> { + private void showFilter() { + Activity activity = getActivity(); + if (activity instanceof HomeActivity) { - @Override - protected List doInBackground(Void... params) { - return getDayList(); + if (!((HomeActivity) activity).mFilterDialog.isAdded()) { + ((HomeActivity) activity).mFilterDialog.show(getActivity().getSupportFragmentManager(), "filter"); + } } + } - @Override - protected void onPostExecute(List result) { - updateViews(result); + private void updateFilterState(MenuItem filter) { + isFilterUsed = false; + List levelIds = preferencesManager.getExpLevels(); + List trackIds = preferencesManager.getTracks(); + + if (!levelIds.isEmpty() || !trackIds.isEmpty()) { + isFilterUsed = true; + } + + if (isFilterUsed) { + filter.setIcon(getResources().getDrawable(R.drawable.ic_filter)); + } else { + filter.setIcon(getResources().getDrawable(R.drawable.ic_filter_empty)); } } - private List getDayList() { - List dayList = new ArrayList<>(); - switch (mEventMode) { - case Bofs: - BofsManager bofsManager = Model.getInstance().getBofsManager(); - dayList.addAll(bofsManager.getBofsDays()); - break; - case Social: - SocialManager socialManager = Model.getInstance().getSocialManager(); - dayList.addAll(socialManager.getSocialsDays()); - break; - case Favorites: - FavoriteManager favoriteManager = Model.getInstance().getFavoriteManager(); - dayList.addAll(favoriteManager.getFavoriteEventDays()); - break; - default: - ProgramManager programManager = Model.getInstance().getProgramManager(); - dayList.addAll(programManager.getProgramDays()); + private void updateData(List requestIds) { + for (int id : requestIds) { + int eventModePos = UpdatesManager.convertEventIdToEventModePos(id); + if (eventModePos == eventMode.ordinal() || + (eventMode == DrawerManager.EventMode.FAVORITES && isEventItem(id))) { + refreshData(); break; + } } - return dayList; } - private void updateViews(List dayList) { + private boolean isEventItem(int id) { + return id == UpdatesManager.PROGRAMS_REQUEST_ID || + id == UpdatesManager.BOFS_REQUEST_ID || + id == UpdatesManager.SOCIALS_REQUEST_ID; + } -// if(!isResumed()){ -// return; -// } + private void updateFavorites() { + if (getView() != null) { + if (eventMode == DrawerManager.EventMode.FAVORITES) { + refreshData(); + } + } + } + private void refreshData() { + if (loadDataTask != null) { + loadDataTask.cancel(true); + } + loadDataTask = new LoadDataTask(eventMode, loadDataCallback); + loadDataTask.execute(); + } + + private final LoadDataTask.LoadDataTaskCallback loadDataCallback = new LoadDataTask.LoadDataTaskCallback() { + @Override + public void onDataLoaded(List result) { + if (isResumed()) { + updateViews(result); + } + } + }; + + private void updateViews(List dayList) { if (dayList.isEmpty()) { - mPagerTabs.setVisibility(View.GONE); - mLayoutPlaceholder.setVisibility(View.VISIBLE); + tabStrip.setVisibility(View.GONE); + layoutPlaceholder.setVisibility(View.VISIBLE); - if (mIsFilterUsed) { - mImageViewNoContent.setVisibility(View.GONE); - mTextViewNoContent.setText(getString(R.string.placeholder_no_matching_events)); + if (isFilterUsed) { + emptyImageView.setVisibility(View.GONE); + emptyLabel.setText(getString(R.string.placeholder_no_matching_events)); } else { - mImageViewNoContent.setVisibility(View.VISIBLE); + emptyImageView.setVisibility(View.VISIBLE); int imageResId = 0, textResId = 0; - switch (mEventMode) { - case Program: + switch (eventMode) { + case PROGRAM: imageResId = R.drawable.ic_no_session; textResId = R.string.placeholder_sessions; break; - case Bofs: + case BOFS: imageResId = R.drawable.ic_no_bofs; textResId = R.string.placeholder_bofs; break; - case Social: + case SOCIAL: imageResId = R.drawable.ic_no_social_events; textResId = R.string.placeholder_social_events; break; - case Favorites: + case FAVORITES: imageResId = R.drawable.ic_no_my_schedule; textResId = R.string.placeholder_schedule; break; } - mImageViewNoContent.setImageResource(imageResId); - mTextViewNoContent.setText(getString(textResId)); + emptyImageView.setImageResource(imageResId); + emptyLabel.setText(getString(textResId)); } } else { - mLayoutPlaceholder.setVisibility(View.GONE); - mPagerTabs.setVisibility(View.VISIBLE); + layoutPlaceholder.setVisibility(View.GONE); + tabStrip.setVisibility(View.VISIBLE); } - mAdapter.setData(dayList, mEventMode); + adapter.setData(dayList, eventMode); switchToCurrentDay(dayList); } private void switchToCurrentDay(List days) { + FragmentActivity activity = getActivity(); + if (activity == null) { + Timber.e("Trying to switch day while not attached to an activity"); + return; + } + int item = 0; for (Long millis : days) { - if (DateUtils.isToday(getActivity(), millis) || DateUtils.isAfterCurrentFate(millis)) { - mViewPager.setCurrentItem(item); + if (DateUtils.isToday(activity, millis) || DateUtils.isAfterCurrentDate(millis)) { + viewPager.setCurrentItem(item); return; } item++; } } - private void showFilter() { - Activity activity = getActivity(); - if (activity instanceof HomeActivity) { - - if (!((HomeActivity) activity).mFilterDialog.isAdded()) { - ((HomeActivity) activity).mFilterDialog.show(getActivity().getSupportFragmentManager(), "filter"); - } - } - } - - private void updateFilterState(@NotNull MenuItem filter) { - mIsFilterUsed = false; - List levelIds = preferencesManager.getExpLevels(); - List trackIds = preferencesManager.getTracks(); - - if (!levelIds.isEmpty() || !trackIds.isEmpty()) { - mIsFilterUsed = true; - } - - if (mIsFilterUsed) { - filter.setIcon(getResources().getDrawable(R.drawable.ic_filter)); - } else { - filter.setIcon(getResources().getDrawable(R.drawable.ic_filter_empty)); - } - } - - private void updateData(List requestIds) { - for (int id : requestIds) { - int eventModePos = UpdatesManager.convertEventIdToEventModePos(id); - if (eventModePos == mEventMode.ordinal() || - (mEventMode == DrawerManager.EventMode.Favorites && isEventItem(id))) { - new LoadData().execute(); - break; - } - } - } - - private boolean isEventItem(int id) { - return id == UpdatesManager.PROGRAMS_REQUEST_ID || - id == UpdatesManager.BOFS_REQUEST_ID || - id == UpdatesManager.SOCIALS_REQUEST_ID; - } - - private void updateFavorites() { - if (getView() != null) { - if (mEventMode == DrawerManager.EventMode.Favorites) { - new LoadData().execute(); - } - } - } } diff --git a/app/src/main/java/com/connfa/ui/fragment/FloorPlanFragment.java b/app/src/main/java/com/connfa/ui/fragment/FloorPlanFragment.java index 5398a87a..8c9849a3 100644 --- a/app/src/main/java/com/connfa/ui/fragment/FloorPlanFragment.java +++ b/app/src/main/java/com/connfa/ui/fragment/FloorPlanFragment.java @@ -30,61 +30,127 @@ public class FloorPlanFragment extends Fragment { public static final String TAG = "FloorPlanFragment"; - private View mLayoutContent, mLayoutPlaceholder; + private View contentView; + private View placeholderView; private Spinner floorSelector; private List plans; private SubsamplingScaleImageView floorImage; + private LoadPlansTask loadPlansTask; + private LoadPlanImageTask loadPlanImageTask; - private UpdatesManager.DataUpdatedListener updateListener = new UpdatesManager.DataUpdatedListener() { - @Override - public void onDataUpdated(List requestIds) { + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View result = inflater.inflate(R.layout.fr_floor_plan, container, false); + contentView = result.findViewById(R.id.layout_content); + placeholderView = result.findViewById(R.id.layout_placeholder); + floorSelector = (Spinner) result.findViewById(R.id.spinner); + floorSelector.setOnItemSelectedListener(itemSelectedListener); - if (requestIds.contains(UpdatesManager.FLOOR_PLANS_REQUEST_ID)) { - new LoadPlansTask().execute(); - } + floorImage = (SubsamplingScaleImageView) result.findViewById(R.id.floor_plan_image); - } - }; + return result; + } @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onStart() { + super.onStart(); Model.getInstance().getUpdatesManager().registerUpdateListener(updateListener); + loadFloorPlans(); } - @Override - public void onDestroy() { - Model.getInstance().getUpdatesManager().unregisterUpdateListener(updateListener); - super.onDestroy(); + private final AdapterView.OnItemSelectedListener itemSelectedListener = new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + loadPlanImage(plans.get(position)); + } + + @Override + public void onNothingSelected(AdapterView parent) { + // Do nothing + } + }; + + private void loadPlanImage(FloorPlan floorPlan) { + if (loadPlanImageTask != null) { + loadPlanImageTask.cancel(true); + } + + floorSelector.setEnabled(false); + floorSelector.setClickable(false); + + loadPlanImageTask = new LoadPlanImageTask(loadPlanImageCallback); + loadPlanImageTask.execute(floorPlan); } + private final LoadPlanImageTask.LoadPlanImageTaskCallback loadPlanImageCallback = new LoadPlanImageTask.LoadPlanImageTaskCallback() { + @Override + public void onPlanImageLoaded(Bitmap planImage) { + floorSelector.setEnabled(true); + floorSelector.setClickable(true); + floorImage.setImage(ImageSource.bitmap(planImage)); + floorImage.resetScaleAndCenter(); + } + }; + @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public void onStop() { + super.onStop(); + Model.getInstance().getUpdatesManager().unregisterUpdateListener(updateListener); + } - View result = inflater.inflate(R.layout.fr_floor_plan, container, false); - mLayoutContent = result.findViewById(R.id.layout_content); - mLayoutPlaceholder = result.findViewById(R.id.layout_placeholder); - floorSelector = (Spinner) result.findViewById(R.id.spinner); - floorSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - new LoadPlanImageTask().execute(plans.get(position)); + private final UpdatesManager.DataUpdatedListener updateListener = new UpdatesManager.DataUpdatedListener() { + @Override + public void onDataUpdated(List requestIds) { + if (requestIds.contains(UpdatesManager.FLOOR_PLANS_REQUEST_ID)) { + loadFloorPlans(); } + } + }; - @Override - public void onNothingSelected(AdapterView parent) { + private void loadFloorPlans() { + if (loadPlansTask != null) { + loadPlansTask.cancel(true); + } + loadPlansTask = new LoadPlansTask(loadPlansCallback); + loadPlansTask.execute(); + } + + private final LoadPlansTask.LoadPlansTaskCallback loadPlansCallback = new LoadPlansTask.LoadPlansTaskCallback() { + @Override + public void onPlansLoaded(List floorPlans) { + plans = floorPlans; + if (floorPlans == null || floorPlans.isEmpty()) { + contentView.setVisibility(View.GONE); + placeholderView.setVisibility(View.VISIBLE); + } else { + contentView.setVisibility(View.VISIBLE); + placeholderView.setVisibility(View.GONE); + + display(floorPlans); } - }); + } + }; - floorImage = (SubsamplingScaleImageView) result.findViewById(R.id.floor_plan_image); + private void display(List floorPlans) { + List names = new ArrayList<>(floorPlans.size()); + for (FloorPlan plan : floorPlans) { + names.add(plan.getName()); + } - new LoadPlansTask().execute(); + FloorSelectorAdapter floorsAdapter = new FloorSelectorAdapter(floorSelector.getContext(), names); + floorSelector.setAdapter(floorsAdapter); - return result; + floorSelector.setVisibility(floorPlans.isEmpty() ? View.INVISIBLE : View.VISIBLE); } - private class LoadPlansTask extends AsyncTask> { + private static class LoadPlansTask extends AsyncTask> { + + private final LoadPlansTaskCallback callback; + + LoadPlansTask(LoadPlansTaskCallback callback) { + this.callback = callback; + } @Override protected List doInBackground(Void... params) { @@ -92,61 +158,48 @@ protected List doInBackground(Void... params) { } @Override - protected void onPostExecute(List floorPlans) { - super.onPostExecute(floorPlans); - plans = floorPlans; - - if (plans == null || plans.isEmpty()) { - mLayoutContent.setVisibility(View.GONE); - mLayoutPlaceholder.setVisibility(View.VISIBLE); - } else { - mLayoutContent.setVisibility(View.VISIBLE); - mLayoutPlaceholder.setVisibility(View.GONE); - - List names = new ArrayList<>(floorPlans.size()); - for (FloorPlan plan : plans) { - names.add(plan.getName()); - } + protected void onPostExecute(@Nullable List floorPlans) { + if (floorPlans != null && !isCancelled()) { + callback.onPlansLoaded(floorPlans); + } + } - FloorSelectorAdapter floorsAdapter = new FloorSelectorAdapter(floorSelector.getContext(), names); - floorSelector.setAdapter(floorsAdapter); + interface LoadPlansTaskCallback { - floorSelector.setVisibility(plans.isEmpty() ? View.INVISIBLE : View.VISIBLE); - } + void onPlansLoaded(List floorPlans); } } - private class LoadPlanImageTask extends AsyncTask { + private static class LoadPlanImageTask extends AsyncTask { - @Override - protected void onPreExecute() { - floorSelector.setEnabled(false); - floorSelector.setClickable(false); + private final LoadPlanImageTaskCallback callback; + + LoadPlanImageTask(LoadPlanImageTaskCallback callback) { + this.callback = callback; } @Override - protected ImageSource doInBackground(FloorPlan... params) { - Bitmap planImage = Model.getInstance() + @Nullable + protected Bitmap doInBackground(FloorPlan... params) { + return Model.getInstance() .getFloorPlansManager() .getImageForPlan( params[0], RECOMMENDED_FLOOR_IMAGE_WIDTH, RECOMMENDED_FLOOR_IMAGE_HEIGHT ); + } - if (planImage != null) { - return ImageSource.bitmap(planImage); + @Override + protected void onPostExecute(@Nullable Bitmap planImage) { + if (planImage != null && !isCancelled()) { + callback.onPlanImageLoaded(planImage); } - return null; } - @Override - protected void onPostExecute(ImageSource imageSource) { - floorSelector.setEnabled(true); - floorSelector.setClickable(true); - floorImage.setImage(imageSource); - floorImage.resetScaleAndCenter(); + interface LoadPlanImageTaskCallback { + + void onPlanImageLoaded(Bitmap planImage); } } - } diff --git a/app/src/main/java/com/connfa/ui/fragment/LoadDataTask.java b/app/src/main/java/com/connfa/ui/fragment/LoadDataTask.java new file mode 100644 index 00000000..9b99346d --- /dev/null +++ b/app/src/main/java/com/connfa/ui/fragment/LoadDataTask.java @@ -0,0 +1,71 @@ +package com.connfa.ui.fragment; + +import android.os.AsyncTask; +import android.support.annotation.Nullable; + +import com.connfa.model.Model; +import com.connfa.model.managers.BofsManager; +import com.connfa.model.managers.FavoriteManager; +import com.connfa.model.managers.ProgramManager; +import com.connfa.model.managers.SocialManager; +import com.connfa.ui.drawer.DrawerManager; + +import java.util.ArrayList; +import java.util.List; + +class LoadDataTask extends AsyncTask> { + + private final DrawerManager.EventMode eventMode; + private final LoadDataTaskCallback callback; + + LoadDataTask(DrawerManager.EventMode eventMode, LoadDataTaskCallback callback) { + this.eventMode = eventMode; + this.callback = callback; + } + + @Override + @Nullable + protected List doInBackground(Void... params) { + if (isCancelled()) { + return null; + } + + List dayList = new ArrayList<>(); + switch (eventMode) { + case BOFS: + BofsManager bofsManager = Model.getInstance().getBofsManager(); + dayList.addAll(bofsManager.getBofsDays()); + break; + case SOCIAL: + SocialManager socialManager = Model.getInstance().getSocialManager(); + dayList.addAll(socialManager.getSocialsDays()); + break; + case FAVORITES: + FavoriteManager favoriteManager = Model.getInstance().getFavoriteManager(); + dayList.addAll(favoriteManager.getFavoriteEventDays()); + break; + default: + ProgramManager programManager = Model.getInstance().getProgramManager(); + dayList.addAll(programManager.getProgramDays()); + break; + } + + if (isCancelled()) { + return null; + } + + return dayList; + } + + @Override + protected void onPostExecute(@Nullable List result) { + if (result != null && callback != null) { + callback.onDataLoaded(result); + } + } + + interface LoadDataTaskCallback { + + void onDataLoaded(List result); + } +} diff --git a/app/src/main/java/com/connfa/ui/fragment/SocialMediaFragment.java b/app/src/main/java/com/connfa/ui/fragment/SocialMediaFragment.java index 03e42bc6..34634950 100644 --- a/app/src/main/java/com/connfa/ui/fragment/SocialMediaFragment.java +++ b/app/src/main/java/com/connfa/ui/fragment/SocialMediaFragment.java @@ -20,6 +20,8 @@ /** * A simple {@link Fragment} subclass. + * + * @deprecated Use {@link com.connfa.social.SocialFeedActivity} instead. */ public class SocialMediaFragment extends Fragment { diff --git a/app/src/main/java/com/connfa/utils/AlarmTask.java b/app/src/main/java/com/connfa/utils/AlarmTask.java index 3ddff2a1..1ab9d1bd 100644 --- a/app/src/main/java/com/connfa/utils/AlarmTask.java +++ b/app/src/main/java/com/connfa/utils/AlarmTask.java @@ -5,7 +5,6 @@ import android.content.Context; import android.content.Intent; -import com.connfa.R; import com.connfa.model.data.EventDetailsEvent; import com.connfa.receiver.NotifyReceiver; @@ -13,7 +12,6 @@ public class AlarmTask implements Runnable { public static final String EXTRA_ID = "EXTRA_ID"; public static final String EXTRA_DAY = "EXTRA_DAY"; - public static final String EXTRA_TEXT = "EXTRA_TEXT"; private static final int FIVE_MINUTES = 5 * 60 * 1000; private final AlarmManager am; @@ -36,8 +34,6 @@ public void run() { intent.putExtra(EXTRA_ID, event.getEventId()); intent.putExtra(EXTRA_DAY, day); - String notifyText = event.getEventName() + context.getString(R.string.start_in_5_minutes); - intent.putExtra(EXTRA_TEXT, notifyText); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, (int) event.getEventId(), intent, PendingIntent.FLAG_UPDATE_CURRENT); am.set(AlarmManager.RTC_WAKEUP, startMillis - FIVE_MINUTES, pendingIntent); diff --git a/app/src/main/java/com/connfa/utils/DateUtils.java b/app/src/main/java/com/connfa/utils/DateUtils.java index f23b53f6..34fa3e2f 100644 --- a/app/src/main/java/com/connfa/utils/DateUtils.java +++ b/app/src/main/java/com/connfa/utils/DateUtils.java @@ -55,7 +55,7 @@ public static boolean isToday(Context context, long millis) { return (todayYear == year && todayMonth == month && todayDay == day); } - public static boolean isAfterCurrentFate(long millis) { + public static boolean isAfterCurrentDate(long millis) { return millis > System.currentTimeMillis(); } diff --git a/app/src/main/res/drawable-v21/selector_light.xml b/app/src/main/res/drawable-v21/selector_light.xml index fd6cc499..4a9cff4f 100644 --- a/app/src/main/res/drawable-v21/selector_light.xml +++ b/app/src/main/res/drawable-v21/selector_light.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + android:color="@color/white_300"> + + diff --git a/app/src/main/res/drawable/group_indicator.xml b/app/src/main/res/drawable/group_indicator.xml index c2daa015..6eb553e5 100644 --- a/app/src/main/res/drawable/group_indicator.xml +++ b/app/src/main/res/drawable/group_indicator.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/app/src/main/res/drawable/rect_light.xml b/app/src/main/res/drawable/rect_light.xml index 424ccb10..9a6cec6b 100644 --- a/app/src/main/res/drawable/rect_light.xml +++ b/app/src/main/res/drawable/rect_light.xml @@ -1,4 +1,4 @@ - - \ No newline at end of file + + diff --git a/app/src/main/res/drawable/selector_favorite.xml b/app/src/main/res/drawable/selector_favorite.xml index 6acf4da6..a1c7b124 100644 --- a/app/src/main/res/drawable/selector_favorite.xml +++ b/app/src/main/res/drawable/selector_favorite.xml @@ -1,7 +1,7 @@ - - - - \ No newline at end of file + + + + diff --git a/app/src/main/res/drawable/selector_light.xml b/app/src/main/res/drawable/selector_light.xml index 663f2681..ac4589fd 100644 --- a/app/src/main/res/drawable/selector_light.xml +++ b/app/src/main/res/drawable/selector_light.xml @@ -1,8 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/app/src/main/res/drawable/shape_favorite.xml b/app/src/main/res/drawable/shape_favorite.xml index 386865f8..6c6ac06d 100644 --- a/app/src/main/res/drawable/shape_favorite.xml +++ b/app/src/main/res/drawable/shape_favorite.xml @@ -1,12 +1,10 @@ - + - + - - \ No newline at end of file + + diff --git a/app/src/main/res/drawable/shape_shadow.xml b/app/src/main/res/drawable/shape_shadow.xml index 62e8e7e1..badc77c9 100644 --- a/app/src/main/res/drawable/shape_shadow.xml +++ b/app/src/main/res/drawable/shape_shadow.xml @@ -1,10 +1,11 @@ - + - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/ac_about.xml b/app/src/main/res/layout/ac_about.xml index 9d406fb2..6734ca2c 100644 --- a/app/src/main/res/layout/ac_about.xml +++ b/app/src/main/res/layout/ac_about.xml @@ -77,7 +77,7 @@ android:background="@drawable/shape_shadow" /> diff --git a/app/src/main/res/layout/ac_about_detail.xml b/app/src/main/res/layout/ac_about_detail.xml index a74ab711..40746e99 100644 --- a/app/src/main/res/layout/ac_about_detail.xml +++ b/app/src/main/res/layout/ac_about_detail.xml @@ -1,62 +1,61 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:background="@android:color/white" + android:orientation="vertical"> - + - + - - + + - + - + - - + + diff --git a/app/src/main/res/layout/ac_event_details.xml b/app/src/main/res/layout/ac_event_details.xml index be096f60..d4697362 100644 --- a/app/src/main/res/layout/ac_event_details.xml +++ b/app/src/main/res/layout/ac_event_details.xml @@ -202,7 +202,7 @@ android:visibility="visible" /> diff --git a/app/src/main/res/layout/ac_main.xml b/app/src/main/res/layout/ac_main.xml index 5db3a92f..a9423379 100644 --- a/app/src/main/res/layout/ac_main.xml +++ b/app/src/main/res/layout/ac_main.xml @@ -12,13 +12,13 @@ android:layout_height="match_parent"> + android:layout_below="@+id/toolbar" /> diff --git a/app/src/main/res/layout/ac_speaker_details.xml b/app/src/main/res/layout/ac_speaker_details.xml index 891d4197..fb48497d 100644 --- a/app/src/main/res/layout/ac_speaker_details.xml +++ b/app/src/main/res/layout/ac_speaker_details.xml @@ -224,7 +224,7 @@ android:background="@color/speaker" /> + android:layout_width="match_parent" + android:layout_height="match_parent"> - + - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_social_feed.xml b/app/src/main/res/layout/activity_social_feed.xml new file mode 100644 index 00000000..2d397546 --- /dev/null +++ b/app/src/main/res/layout/activity_social_feed.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_filter.xml b/app/src/main/res/layout/dialog_filter.xml index 63348398..f4a092aa 100644 --- a/app/src/main/res/layout/dialog_filter.xml +++ b/app/src/main/res/layout/dialog_filter.xml @@ -1,73 +1,73 @@ + android:layout_width="match_parent" + android:layout_height="wrap_content" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:background="@android:color/white" + android:orientation="vertical"> - + - + - + - + - - + + diff --git a/app/src/main/res/layout/dialog_timezone_warning.xml b/app/src/main/res/layout/dialog_timezone_warning.xml index 6afaf013..a72d24c8 100644 --- a/app/src/main/res/layout/dialog_timezone_warning.xml +++ b/app/src/main/res/layout/dialog_timezone_warning.xml @@ -1,26 +1,26 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="16dp"> - + - + diff --git a/app/src/main/res/layout/fr_event.xml b/app/src/main/res/layout/fr_event.xml index 1d46809c..7f487b4b 100644 --- a/app/src/main/res/layout/fr_event.xml +++ b/app/src/main/res/layout/fr_event.xml @@ -1,30 +1,30 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@android:color/white"> - + - + - + diff --git a/app/src/main/res/layout/fr_holder_event.xml b/app/src/main/res/layout/fr_holder_event.xml index 3e1f65f0..2b69609c 100644 --- a/app/src/main/res/layout/fr_holder_event.xml +++ b/app/src/main/res/layout/fr_holder_event.xml @@ -1,64 +1,63 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:tools="http://schemas.android.com/tools" + android:background="@android:color/white" + android:orientation="vertical"> - + - - + - + - + - - + + diff --git a/app/src/main/res/layout/fr_location.xml b/app/src/main/res/layout/fr_location.xml index aa9fcf25..a7290b7f 100644 --- a/app/src/main/res/layout/fr_location.xml +++ b/app/src/main/res/layout/fr_location.xml @@ -1,56 +1,56 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical"> - + - + - + - - + + - + diff --git a/app/src/main/res/layout/fr_speakers.xml b/app/src/main/res/layout/fr_speakers.xml index 1b3f2dfb..3dc2bc32 100644 --- a/app/src/main/res/layout/fr_speakers.xml +++ b/app/src/main/res/layout/fr_speakers.xml @@ -1,72 +1,71 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:background="@android:color/white"> - + - + - + - - + + - + - + - - + + diff --git a/app/src/main/res/layout/fragment_social_media.xml b/app/src/main/res/layout/fragment_social_media.xml index b3b1d26f..2f835230 100644 --- a/app/src/main/res/layout/fragment_social_media.xml +++ b/app/src/main/res/layout/fragment_social_media.xml @@ -1,60 +1,60 @@ + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="com.connfa.ui.fragment.SocialMediaFragment"> - + - + - - - - + + android:layout_width="wrap_content" + android:gravity="center_horizontal" + android:layout_marginTop="@dimen/margin_top_placeholder_text" + android:layout_height="wrap_content" + android:text="@string/placeholder_social_media" + app:custom_font="@string/roboto_regular" + android:textSize="@dimen/text_size_placeholder" + android:textColor="@color/placeholder_text" /> + + + - + diff --git a/app/src/main/res/layout/item_about.xml b/app/src/main/res/layout/item_about.xml index 53133e11..6b3b59b2 100644 --- a/app/src/main/res/layout/item_about.xml +++ b/app/src/main/res/layout/item_about.xml @@ -1,30 +1,30 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> - + - + diff --git a/app/src/main/res/layout/item_filter_group.xml b/app/src/main/res/layout/item_filter_group.xml index 63cea200..05c24d39 100644 --- a/app/src/main/res/layout/item_filter_group.xml +++ b/app/src/main/res/layout/item_filter_group.xml @@ -1,31 +1,31 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical"> - + - + diff --git a/app/src/main/res/layout/item_filter_list.xml b/app/src/main/res/layout/item_filter_list.xml index db8864cf..16fabb13 100644 --- a/app/src/main/res/layout/item_filter_list.xml +++ b/app/src/main/res/layout/item_filter_list.xml @@ -1,49 +1,50 @@ + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/layoutChild" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/selector_light" + android:clickable="true" + android:descendantFocusability="blocksDescendants" + android:orientation="vertical"> - + - + - - + + - + diff --git a/app/src/main/res/layout/item_header.xml b/app/src/main/res/layout/item_header.xml index 6ba82ef9..594da340 100644 --- a/app/src/main/res/layout/item_header.xml +++ b/app/src/main/res/layout/item_header.xml @@ -1,20 +1,19 @@ - + diff --git a/app/src/main/res/layout/item_speakers_event.xml b/app/src/main/res/layout/item_speakers_event.xml index bdc9e5c7..a315ffff 100644 --- a/app/src/main/res/layout/item_speakers_event.xml +++ b/app/src/main/res/layout/item_speakers_event.xml @@ -1,84 +1,84 @@ + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/selector_light"> - + - + - + - + - + - + - + - - + + diff --git a/app/src/main/res/layout/nav_drawer_header.xml b/app/src/main/res/layout/nav_drawer_header.xml index 0ffb49f7..4d337185 100644 --- a/app/src/main/res/layout/nav_drawer_header.xml +++ b/app/src/main/res/layout/nav_drawer_header.xml @@ -1,14 +1,13 @@ + android:orientation="vertical" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> - - + - \ No newline at end of file + diff --git a/app/src/main/res/menu/menu_filter.xml b/app/src/main/res/menu/menu_filter.xml index 8747bf8e..522e6215 100644 --- a/app/src/main/res/menu/menu_filter.xml +++ b/app/src/main/res/menu/menu_filter.xml @@ -1,12 +1,12 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="com.example.toolbar.MainActivity"> - + diff --git a/app/src/main/res/menu/menu_search.xml b/app/src/main/res/menu/menu_search.xml index f22fd0c7..c97b65c9 100644 --- a/app/src/main/res/menu/menu_search.xml +++ b/app/src/main/res/menu/menu_search.xml @@ -1,10 +1,10 @@ - - \ No newline at end of file + xmlns:app="http://schemas.android.com/apk/res-auto"> + + diff --git a/app/src/main/res/menu/menu_share.xml b/app/src/main/res/menu/menu_share.xml index 65b831a3..ed132829 100644 --- a/app/src/main/res/menu/menu_share.xml +++ b/app/src/main/res/menu/menu_share.xml @@ -1,13 +1,13 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="com.example.toolbar.MainActivity"> - - \ No newline at end of file + + diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml index 63fc8164..1e656d65 100644 --- a/app/src/main/res/values-w820dp/dimens.xml +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -1,6 +1,6 @@ - - 64dp + + 64dp diff --git a/app/src/main/res/values/attributes.xml b/app/src/main/res/values/attributes.xml index d3585a80..cd6cd715 100644 --- a/app/src/main/res/values/attributes.xml +++ b/app/src/main/res/values/attributes.xml @@ -1,5 +1,4 @@ - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index ee115cd7..e2521456 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -17,5 +17,6 @@ 16dp 14sp 20dp + 56dp diff --git a/app/src/main/res/values/fonts.xml b/app/src/main/res/values/fonts.xml index a1a36e34..e98b85e5 100644 --- a/app/src/main/res/values/fonts.xml +++ b/app/src/main/res/values/fonts.xml @@ -1,5 +1,4 @@ - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3d64ef30..e4939a0e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,7 +44,8 @@ Don\'t miss it! 24 HOURS Attention - " starts in 5 minutes" + "In 5 minutes, in %s" + "In 5 minutes, in %1$s\n%2$s" to %s ", " ]]> @@ -56,4 +57,7 @@ Floor Plans No Details + No Tweets for %s… yet + Social Feed + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0d9df804..81cd9cee 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,32 +1,47 @@ - - - + + - - + + +