├── webservice ├── log │ └── .keep ├── app │ ├── mailers │ │ └── .keep │ ├── models │ │ ├── .keep │ │ ├── concerns │ │ │ └── .keep │ │ ├── meeting.rb │ │ └── rating.rb │ ├── assets │ │ ├── images │ │ │ └── .keep │ │ ├── javascripts │ │ │ └── application.js │ │ └── stylesheets │ │ │ └── application.css │ ├── controllers │ │ ├── concerns │ │ │ └── .keep │ │ ├── application_controller.rb │ │ └── meetings_controller.rb │ ├── helpers │ │ └── application_helper.rb │ └── views │ │ ├── meetings │ │ ├── mymeetings.json.jbuilder │ │ ├── create.json.jbuilder │ │ ├── show.json.jbuilder │ │ └── index.json.jbuilder │ │ └── layouts │ │ └── application.html.erb ├── lib │ ├── assets │ │ └── .keep │ ├── tasks │ │ └── .keep │ └── response.rb ├── test │ ├── models │ │ └── .keep │ ├── controllers │ │ └── .keep │ ├── fixtures │ │ └── .keep │ ├── helpers │ │ └── .keep │ ├── integration │ │ └── .keep │ ├── mailers │ │ └── .keep │ └── test_helper.rb ├── public │ ├── favicon.ico │ ├── robots.txt │ ├── 500.html │ ├── 422.html │ └── 404.html ├── vendor │ └── assets │ │ ├── javascripts │ │ └── .keep │ │ └── stylesheets │ │ └── .keep ├── Procfile ├── config │ ├── boot.rb │ ├── initializers │ │ ├── cookies_serializer.rb │ │ ├── session_store.rb │ │ ├── mime_types.rb │ │ ├── filter_parameter_logging.rb │ │ ├── backtrace_silencers.rb │ │ ├── assets.rb │ │ ├── wrap_parameters.rb │ │ └── inflections.rb │ ├── environment.rb │ ├── routes.rb │ ├── database.yml │ ├── locales │ │ └── en.yml │ ├── secrets.yml │ ├── application.rb │ └── environments │ │ ├── development.rb │ │ ├── test.rb │ │ └── production.rb ├── config.ru ├── Rakefile ├── db │ ├── migrate │ │ ├── 20150323194915_add_event_id_to_rating.rb │ │ ├── 20150323140001_create_meetings.rb │ │ └── 20150323140011_create_ratings.rb │ ├── seeds.rb │ └── schema.rb ├── README.md ├── .gitignore ├── Gemfile └── Gemfile.lock ├── android_app ├── app │ ├── .gitignore │ ├── src │ │ └── main │ │ │ ├── res │ │ │ ├── mipmap-hdpi │ │ │ │ ├── icon.png │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── icon.png │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── icon.png │ │ │ │ └── ic_launcher.png │ │ │ ├── drawable-mdpi │ │ │ │ ├── icon.png │ │ │ │ ├── splashnexus6.png │ │ │ │ └── material_design_icons.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── icon.png │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── icon.png │ │ │ ├── xml │ │ │ │ └── network_security_config.xml │ │ │ ├── values │ │ │ │ ├── plurals.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── styles.xml │ │ │ │ └── strings.xml │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ ├── menu │ │ │ │ └── menu_main.xml │ │ │ └── layout │ │ │ │ ├── activity_no_network_activity.xml │ │ │ │ ├── activity_calendar.xml │ │ │ │ ├── fragment_calendar_page.xml │ │ │ │ ├── fragment_calendar_range_display.xml │ │ │ │ ├── rating_view.xml │ │ │ │ ├── activity_connect.xml │ │ │ │ ├── fragment_rating_dialog.xml │ │ │ │ ├── activity_navigation_drawer.xml │ │ │ │ └── event_view.xml │ │ │ ├── java │ │ │ └── com │ │ │ │ └── microsoft │ │ │ │ └── office365 │ │ │ │ └── meetingfeedback │ │ │ │ ├── PageSettable.java │ │ │ │ ├── model │ │ │ │ ├── EventFilter.java │ │ │ │ ├── outlook │ │ │ │ │ ├── payload │ │ │ │ │ │ ├── From.java │ │ │ │ │ │ ├── Sender.java │ │ │ │ │ │ ├── Attendee.java │ │ │ │ │ │ ├── Organizer.java │ │ │ │ │ │ ├── ToRecipient.java │ │ │ │ │ │ ├── Envelope.java │ │ │ │ │ │ ├── Date.java │ │ │ │ │ │ ├── Body.java │ │ │ │ │ │ ├── EmailAddress.java │ │ │ │ │ │ ├── MessageWrapper.java │ │ │ │ │ │ ├── Message.java │ │ │ │ │ │ └── Event.java │ │ │ │ │ ├── EmailInterface.java │ │ │ │ │ ├── CalendarInterface.java │ │ │ │ │ └── CalendarService.java │ │ │ │ ├── SavedRatings.java │ │ │ │ ├── authentication │ │ │ │ │ └── AuthenticationContextBuilder.java │ │ │ │ ├── User.java │ │ │ │ ├── webservice │ │ │ │ │ ├── payload │ │ │ │ │ │ ├── CreateRatingRequest.java │ │ │ │ │ │ └── MeetingServiceResponseData.java │ │ │ │ │ ├── RatingServiceInterface.java │ │ │ │ │ ├── RatingService.java │ │ │ │ │ └── RatingServiceManager.java │ │ │ │ ├── meeting │ │ │ │ │ ├── EventGroup.java │ │ │ │ │ ├── DateRange.java │ │ │ │ │ ├── RatingData.java │ │ │ │ │ └── EventDecorator.java │ │ │ │ ├── service │ │ │ │ │ ├── MyMeetingsResponse.java │ │ │ │ │ └── RatingServiceAlarmManager.java │ │ │ │ ├── Constants.java │ │ │ │ └── DataStore.java │ │ │ │ ├── view │ │ │ │ ├── ShowRatingDialogEvent.java │ │ │ │ ├── DialogConfig.java │ │ │ │ ├── CalendarFragmentPagerAdapter.java │ │ │ │ ├── RateMyMeetingsDialogFragment.java │ │ │ │ ├── RatingsRecyclerViewAdapter.java │ │ │ │ ├── CalendarRangeFragment.java │ │ │ │ ├── CalendarPageFragment.java │ │ │ │ ├── EventsRecyclerViewAdapter.java │ │ │ │ └── RatingDialogFragment.java │ │ │ │ ├── RatingActivity.java │ │ │ │ ├── MeetingFeedbackApplication.java │ │ │ │ ├── util │ │ │ │ ├── ConnectivityUtil.java │ │ │ │ ├── SharedPrefsUtil.java │ │ │ │ ├── FormatUtil.java │ │ │ │ ├── CalendarUtil.java │ │ │ │ └── DialogUtil.java │ │ │ │ ├── BaseFragment.java │ │ │ │ ├── BaseDialogFragment.java │ │ │ │ ├── NoNetworkActivity.java │ │ │ │ ├── inject │ │ │ │ ├── ApplicationModule.java │ │ │ │ └── ActivityModule.java │ │ │ │ ├── ConnectActivity.java │ │ │ │ ├── NavigationBarActivity.java │ │ │ │ └── BaseActivity.java │ │ │ └── AndroidManifest.xml │ ├── proguard-rules.pro │ └── build.gradle ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── .gitignore ├── gradle.properties ├── build.gradle └── gradlew.bat ├── readme-images ├── O365-Android-MeetingFeedback-SendAs.png ├── O365-Android-MeetingFeedback-Constants.png └── O365-Android-MeetingFeedback-video_play_icon.png ├── .travis.yml ├── LICENSE.txt ├── NOTICES.md └── README-Localized ├── README-zh-tw.md ├── README-zh-cn.md └── README-ja-jp.md /webservice/log/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/app/mailers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/app/models/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/lib/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/lib/tasks/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/test/models/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/test/controllers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/test/fixtures/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/test/helpers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/test/integration/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/test/mailers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/app/assets/images/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/app/models/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android_app/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | 3 | -------------------------------------------------------------------------------- /webservice/app/controllers/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/vendor/assets/javascripts/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webservice/vendor/assets/stylesheets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android_app/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /webservice/Procfile: -------------------------------------------------------------------------------- 1 | web: bundle exec thin start -p $PORT -------------------------------------------------------------------------------- /webservice/config/boot.rb: -------------------------------------------------------------------------------- 1 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 2 | 3 | require 'bundler/setup' # Set up gems listed in the Gemfile. 4 | -------------------------------------------------------------------------------- /android_app/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-hdpi/icon.png -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-mdpi/icon.png -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-xhdpi/icon.png -------------------------------------------------------------------------------- /webservice/config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Rails.application 5 | -------------------------------------------------------------------------------- /webservice/config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.action_dispatch.cookies_serializer = :json 4 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/drawable-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/drawable-mdpi/icon.png -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-xxhdpi/icon.png -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-xxxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-xxxhdpi/icon.png -------------------------------------------------------------------------------- /readme-images/O365-Android-MeetingFeedback-SendAs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/readme-images/O365-Android-MeetingFeedback-SendAs.png -------------------------------------------------------------------------------- /webservice/config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require File.expand_path('../application', __FILE__) 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /webservice/config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.session_store :cookie_store, key: '_MeetingData_session' 4 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /readme-images/O365-Android-MeetingFeedback-Constants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/readme-images/O365-Android-MeetingFeedback-Constants.png -------------------------------------------------------------------------------- /android_app/app/src/main/res/drawable-mdpi/splashnexus6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/drawable-mdpi/splashnexus6.png -------------------------------------------------------------------------------- /android_app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /readme-images/O365-Android-MeetingFeedback-video_play_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/readme-images/O365-Android-MeetingFeedback-video_play_icon.png -------------------------------------------------------------------------------- /webservice/config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/drawable-mdpi/material_design_icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoftgraph/android-java-meetingfeedback-rest-sample/master/android_app/app/src/main/res/drawable-mdpi/material_design_icons.png -------------------------------------------------------------------------------- /webservice/app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | module ApplicationHelper 6 | end 7 | -------------------------------------------------------------------------------- /webservice/public/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /webservice/config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Configure sensitive parameters which will be filtered from the log file. 4 | Rails.application.config.filter_parameters += [:password] 5 | -------------------------------------------------------------------------------- /webservice/app/models/meeting.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | class Meeting < ActiveRecord::Base 6 | has_many :ratings 7 | end 8 | -------------------------------------------------------------------------------- /webservice/Rakefile: -------------------------------------------------------------------------------- 1 | # Add your own tasks in files placed in lib/tasks ending in .rake, 2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 | 4 | require File.expand_path('../config/application', __FILE__) 5 | 6 | Rails.application.load_tasks 7 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10.0.2.2 5 | 6 | -------------------------------------------------------------------------------- /android_app/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon May 06 16:03:03 EAT 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip 7 | -------------------------------------------------------------------------------- /android_app/.gitignore: -------------------------------------------------------------------------------- 1 | *.ap_ 2 | *.apk 3 | *.class 4 | *.dex 5 | *.iml 6 | *.ipr 7 | *.iws 8 | .DS_Store 9 | .classpath 10 | .gradle 11 | .idea 12 | .project 13 | /.idea/libraries 14 | /.idea/workspace.xml 15 | /build 16 | /captures 17 | /local.properties 18 | Thumbs.db 19 | bin/ 20 | build/ 21 | gen/ 22 | out/ -------------------------------------------------------------------------------- /webservice/app/models/rating.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | class Rating < ActiveRecord::Base 6 | belongs_to :meeting 7 | validates :username, uniqueness: {scope: [:meeting_id]} 8 | end 9 | -------------------------------------------------------------------------------- /webservice/app/views/meetings/mymeetings.json.jbuilder: -------------------------------------------------------------------------------- 1 | # Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 2 | # See LICENSE in the project root for license information. 3 | 4 | json.meeting_data @mymeetings do |meeting| 5 | json.event_id meeting[:event_id] 6 | json.num_ratings meeting[:num_ratings] 7 | end 8 | -------------------------------------------------------------------------------- /webservice/db/migrate/20150323194915_add_event_id_to_rating.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | class AddEventIdToRating < ActiveRecord::Migration 6 | def change 7 | add_column :ratings, :event_id, :string 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /webservice/db/seeds.rb: -------------------------------------------------------------------------------- 1 | # This file should contain all the record creation needed to seed the database with its default values. 2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). 3 | # 4 | # Examples: 5 | # 6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) 7 | # Mayor.create(name: 'Emanuel', city: cities.first) 8 | -------------------------------------------------------------------------------- /webservice/test/test_helper.rb: -------------------------------------------------------------------------------- 1 | ENV['RAILS_ENV'] ||= 'test' 2 | require File.expand_path('../../config/environment', __FILE__) 3 | require 'rails/test_help' 4 | 5 | class ActiveSupport::TestCase 6 | # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 7 | fixtures :all 8 | 9 | # Add more helper methods to be used by all tests here... 10 | end 11 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/PageSettable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback; 6 | 7 | public interface PageSettable { 8 | void onPageSet(int page); 9 | } 10 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/EventFilter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model; 6 | 7 | public enum EventFilter { 8 | MY_MEETINGS, 9 | RATE_MEETINGS 10 | } 11 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/values/plurals.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | Rating 8 | Ratings 9 | 10 | 11 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | #ffffff 7 | #363636 8 | #006E8D 9 | 10 | -------------------------------------------------------------------------------- /webservice/app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MeetingData 5 | <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> 6 | <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> 7 | <%= csrf_meta_tags %> 8 | 9 | 10 | 11 | <%= yield %> 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /webservice/db/migrate/20150323140001_create_meetings.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | class CreateMeetings < ActiveRecord::Migration 6 | def change 7 | create_table :meetings do |t| 8 | t.string :event_id 9 | t.string :owner 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /webservice/app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | class ApplicationController < ActionController::Base 6 | # Prevent CSRF attacks by raising an exception. 7 | # For APIs, you may want to use :null_session instead. 8 | # protect_from_forgery with: :exception 9 | end 10 | -------------------------------------------------------------------------------- /webservice/config/routes.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | Rails.application.routes.draw do 6 | 7 | resources :meetings, :defaults => { :format => 'json' } do 8 | resource :rating 9 | 10 | end 11 | 12 | get 'mymeetings', controller: :meetings, 13 | action: :mymeetings 14 | 15 | end 16 | -------------------------------------------------------------------------------- /webservice/config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/view/ShowRatingDialogEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.view; 6 | 7 | public class ShowRatingDialogEvent { 8 | public String mEventId; 9 | 10 | public ShowRatingDialogEvent(String eventId) { 11 | mEventId = eventId; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /webservice/README.md: -------------------------------------------------------------------------------- 1 | == RateMyMeetings WebService 2 | 3 | This app currently runs on Azure at ratemymeetings.cloudapp.net 4 | 5 | service directory: 6 | /home/josh/office365-android/webservice 7 | 8 | start: 9 | 10 | `bundle exec foreman start` 11 | 12 | stop: 13 | 14 | `kill $(ps aux | grep -E 'thin' | grep -v grep | awk '{print $2}')` 15 | 16 | check running: 17 | 18 | `netstat -tulpn` 19 | 20 | clear database: 21 | 22 | `rake db:drop` 23 | 24 | `rake db:create` 25 | 26 | `rake db:migrate` -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/From.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class From { 10 | 11 | @SerializedName("EmailAddress") 12 | public EmailAddress emailAddress; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/Sender.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class Sender { 10 | 11 | @SerializedName("EmailAddress") 12 | public EmailAddress emailAddress; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /webservice/db/migrate/20150323140011_create_ratings.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | class CreateRatings < ActiveRecord::Migration 6 | def change 7 | create_table :ratings do |t| 8 | t.decimal :value, required: true 9 | t.belongs_to :meeting 10 | t.text :comment 11 | t.string :username 12 | end 13 | add_index :ratings, :meeting_id 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/RatingActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback; 6 | 7 | import com.microsoft.office365.meetingfeedback.model.meeting.RatingData; 8 | 9 | public interface RatingActivity { 10 | void onSendRating(com.microsoft.graph.models.extensions.Event event, RatingData ratingData); 11 | } 12 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/Attendee.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class Attendee { 10 | 11 | @SerializedName("EmailAddress") 12 | public EmailAddress emailAddress; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/Organizer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class Organizer { 10 | 11 | @SerializedName("emailAddress") 12 | public EmailAddress emailAddress; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/ToRecipient.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class ToRecipient { 10 | 11 | @SerializedName("EmailAddress") 12 | public EmailAddress emailAddress; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /webservice/app/views/meetings/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | # Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 2 | # See LICENSE in the project root for license information. 3 | 4 | json.event_id @response.event_id 5 | json.owner @response.owner 6 | json.is_meeting_owner @response.meeting_owner? 7 | json.has_already_rated @response.has_already_rated? 8 | if @response.has_already_rated? 9 | json.your_rating @response.your_rating 10 | end 11 | json.avg_rating @response.avg_rating 12 | json.ratings @response.ratings 13 | -------------------------------------------------------------------------------- /webservice/app/views/meetings/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | # Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 2 | # See LICENSE in the project root for license information. 3 | 4 | json.event_id @response.event_id 5 | json.owner @response.owner 6 | json.is_meeting_owner @response.meeting_owner? 7 | json.has_already_rated @response.has_already_rated? 8 | if @response.has_already_rated? 9 | json.your_rating @response.your_rating 10 | end 11 | json.avg_rating @response.avg_rating 12 | json.ratings @response.ratings 13 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/Envelope.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | import java.util.List; 10 | 11 | public class Envelope { 12 | 13 | @SerializedName("value") 14 | public List mValues; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /webservice/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files for more about ignoring files. 2 | # 3 | # If you find yourself ignoring temporary files generated by your text editor 4 | # or operating system, you probably want to add a global ignore instead: 5 | # git config --global core.excludesfile '~/.gitignore_global' 6 | 7 | # Ignore bundler config. 8 | /.bundle 9 | 10 | # Ignore the default SQLite database. 11 | /db/*.sqlite3 12 | /db/*.sqlite3-journal 13 | 14 | # Ignore all logfiles and tempfiles. 15 | /log/* 16 | !/log/.keep 17 | /tmp 18 | -------------------------------------------------------------------------------- /webservice/config/initializers/assets.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Version of your assets, change this if you want to expire all your assets. 4 | Rails.application.config.assets.version = '1.0' 5 | 6 | # Add additional assets to the asset load path 7 | # Rails.application.config.assets.paths << Emoji.images_path 8 | 9 | # Precompile additional assets. 10 | # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. 11 | # Rails.application.config.assets.precompile += %w( search.js ) 12 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/Date.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class Date { 10 | 11 | @SerializedName("dateTime") 12 | public String mDateTime; 13 | 14 | @SerializedName("timeZone") 15 | public String mTimeZone; 16 | } 17 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/Body.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class Body { 10 | 11 | @SerializedName("ContentType") 12 | public String mContentType; 13 | 14 | @SerializedName("Content") 15 | public String mContent; 16 | 17 | } 18 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/EmailAddress.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class EmailAddress { 10 | 11 | @SerializedName("name") 12 | public String mName; 13 | 14 | @SerializedName("address") 15 | public String mAddress; 16 | 17 | } 18 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 9 | 64dp 10 | 11 | -------------------------------------------------------------------------------- /webservice/app/views/meetings/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | # Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 2 | # See LICENSE in the project root for license information. 3 | 4 | json.array! @responses do |response| 5 | json.event_id response.event_id 6 | json.owner response.owner 7 | json.is_meeting_owner response.meeting_owner? 8 | json.has_already_rated response.has_already_rated? 9 | if response.has_already_rated? 10 | json.your_rating response.your_rating 11 | end 12 | json.avg_rating response.avg_rating 13 | json.ratings response.ratings 14 | end 15 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/MessageWrapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class MessageWrapper { 10 | 11 | @SerializedName("Message") 12 | public Message mMessage; 13 | 14 | public MessageWrapper(Message msg) { 15 | mMessage = msg; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /webservice/config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # This file contains settings for ActionController::ParamsWrapper which 4 | # is enabled by default. 5 | 6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 7 | ActiveSupport.on_load(:action_controller) do 8 | wrap_parameters format: [:json] if respond_to?(:wrap_parameters) 9 | end 10 | 11 | # To enable root element in JSON for ActiveRecord objects. 12 | # ActiveSupport.on_load(:active_record) do 13 | # self.include_root_in_json = true 14 | # end 15 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /webservice/config/database.yml: -------------------------------------------------------------------------------- 1 | # SQLite version 3.x 2 | # gem install sqlite3 3 | # 4 | # Ensure the SQLite 3 gem is defined in your Gemfile 5 | # gem 'sqlite3' 6 | # 7 | default: &default 8 | adapter: sqlite3 9 | pool: 5 10 | timeout: 5000 11 | 12 | development: 13 | <<: *default 14 | database: db/development.sqlite3 15 | 16 | # Warning: The database defined as "test" will be erased and 17 | # re-generated from your development database when you run "rake". 18 | # Do not set this db to the same as development or production. 19 | test: 20 | <<: *default 21 | database: db/test.sqlite3 22 | 23 | production: 24 | <<: *default 25 | database: db/production.sqlite3 26 | -------------------------------------------------------------------------------- /webservice/Gemfile: -------------------------------------------------------------------------------- 1 | =begin 2 | Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | See LICENSE in the project root for license information. 4 | =end 5 | source 'https://rubygems.org' 6 | 7 | ruby '2.0.0' 8 | 9 | gem 'tzinfo-data' 10 | gem 'foreman' 11 | gem 'thin' 12 | gem 'rails', '4.2.1.rc2' 13 | gem 'responders' 14 | gem 'sqlite3' 15 | gem 'sass-rails', '~> 5.0' 16 | gem 'uglifier', '>= 1.3.0' 17 | gem 'coffee-rails', '~> 4.1.0' 18 | gem 'jquery-rails' 19 | gem 'turbolinks' 20 | gem 'jbuilder', '~> 2.0' 21 | gem 'sdoc', '~> 0.4.0', group: :doc 22 | 23 | group :development, :test do 24 | gem 'pry' 25 | gem 'web-console', '~> 2.0' 26 | gem 'spring' 27 | end 28 | -------------------------------------------------------------------------------- /webservice/config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new inflection rules using the following format. Inflections 4 | # are locale specific, and you may define rules for as many different 5 | # locales as you wish. All of these examples are active by default: 6 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 7 | # inflect.plural /^(ox)$/i, '\1en' 8 | # inflect.singular /^(ox)en/i, '\1' 9 | # inflect.irregular 'person', 'people' 10 | # inflect.uncountable %w( fish sheep ) 11 | # end 12 | 13 | # These inflection rules are supported but not enabled by default: 14 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 15 | # inflect.acronym 'RESTful' 16 | # end 17 | -------------------------------------------------------------------------------- /android_app/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/joshskeen/android-sdks/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /webservice/config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Files in the config/locales directory are used for internationalization 2 | # and are automatically loaded by Rails. If you want to use locales other 3 | # than English, add the necessary files in this directory. 4 | # 5 | # To use the locales, use `I18n.t`: 6 | # 7 | # I18n.t 'hello' 8 | # 9 | # In views, this is aliased to just `t`: 10 | # 11 | # <%= t('hello') %> 12 | # 13 | # To use a different locale, set it with `I18n.locale`: 14 | # 15 | # I18n.locale = :es 16 | # 17 | # This would use the information in config/locales/es.yml. 18 | # 19 | # To learn more, please read the Rails Internationalization guide 20 | # available at http://guides.rubyonrails.org/i18n.html. 21 | 22 | en: 23 | hello: "Hello world" 24 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/SavedRatings.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model; 6 | 7 | import com.microsoft.office365.meetingfeedback.model.meeting.RatingData; 8 | 9 | import java.util.Map; 10 | 11 | public class SavedRatings { 12 | 13 | Map mSavedRatings; 14 | 15 | public SavedRatings(Map savedRatings) { 16 | mSavedRatings = savedRatings; 17 | } 18 | 19 | public Map getSavedRatings() { 20 | return mSavedRatings; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/authentication/AuthenticationContextBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.authentication; 6 | 7 | import android.content.Context; 8 | 9 | import com.microsoft.identity.client.PublicClientApplication; 10 | import com.microsoft.office365.meetingfeedback.model.Constants; 11 | 12 | public class AuthenticationContextBuilder { 13 | 14 | public static PublicClientApplication newInstance(Context context) { 15 | return new PublicClientApplication(context, Constants.CLIENT_ID); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /webservice/app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js, which will include all the files 2 | // listed below. 3 | // 4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, 5 | // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. 6 | // 7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the 8 | // compiled file. 9 | // 10 | // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details 11 | // about supported directives. 12 | // 13 | //= require jquery 14 | //= require jquery_ujs 15 | //= require turbolinks 16 | //= require_tree . 17 | -------------------------------------------------------------------------------- /webservice/app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll be compiled into application.css, which will include all the files 3 | * listed below. 4 | * 5 | * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, 6 | * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. 7 | * 8 | * You're free to add application-wide styles to this file and they'll appear at the bottom of the 9 | * compiled file so the styles you add here take precedence over styles defined in any styles 10 | * defined in the other CSS/SCSS files in this directory. It is generally better to create a new 11 | * file per style scope. 12 | * 13 | *= require_tree . 14 | *= require_self 15 | */ 16 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/view/DialogConfig.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.view; 6 | 7 | import java.io.Serializable; 8 | 9 | public class DialogConfig implements Serializable { 10 | 11 | public String mTitle; 12 | public String mMessage; 13 | public DialogType mDialogType; 14 | 15 | public enum DialogType { 16 | ALERT, 17 | PROGRESS 18 | } 19 | 20 | public DialogConfig(String title, String message, DialogType dialogType) { 21 | mTitle = title; 22 | mMessage = message; 23 | mDialogType = dialogType; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/User.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model; 6 | 7 | import com.microsoft.identity.client.IAccount; 8 | 9 | public class User { 10 | 11 | private String mUserId; 12 | private String mUsername; 13 | 14 | 15 | public User(IAccount userInfo) { 16 | mUserId = userInfo.getAccountIdentifier().getIdentifier(); 17 | mUsername = userInfo.getUsername(); 18 | } 19 | 20 | public String getUserId() { 21 | return mUserId; 22 | } 23 | 24 | public String getUsername() { 25 | return mUsername; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/EmailInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook; 6 | 7 | import com.microsoft.office365.meetingfeedback.model.outlook.payload.MessageWrapper; 8 | 9 | import retrofit.Callback; 10 | import retrofit.http.Body; 11 | import retrofit.http.Header; 12 | import retrofit.http.POST; 13 | 14 | public interface EmailInterface { 15 | @POST("/me/microsoft.graph.sendmail") 16 | void sendMail( 17 | @Header("Content-type") String contentTypeHeader, 18 | @Body MessageWrapper mail, 19 | Callback callback); 20 | } 21 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/Message.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | /** 10 | * Mail Value Object for holding values in an email 11 | */ 12 | public class Message { 13 | 14 | @SerializedName("Subject") 15 | public String mSubject; 16 | 17 | @SerializedName("Body") 18 | public Body mBody; 19 | 20 | @SerializedName("ToRecipients") 21 | public ToRecipient[] mToRecipients; 22 | 23 | @SerializedName("sender") 24 | public Sender mSender; 25 | 26 | @SerializedName("from") 27 | public From mFrom; 28 | } 29 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/MeetingFeedbackApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback; 6 | 7 | import android.app.Application; 8 | 9 | import com.microsoft.office365.meetingfeedback.inject.ApplicationModule; 10 | 11 | import dagger.ObjectGraph; 12 | 13 | public class MeetingFeedbackApplication extends Application { 14 | 15 | private ObjectGraph applicationGraph; 16 | 17 | @Override 18 | public void onCreate() { 19 | super.onCreate(); 20 | 21 | applicationGraph = ObjectGraph.create(new ApplicationModule(this)); 22 | } 23 | 24 | public ObjectGraph getApplicationGraph() { 25 | return applicationGraph; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /android_app/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/util/ConnectivityUtil.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.util; 6 | 7 | import android.content.Context; 8 | import android.net.ConnectivityManager; 9 | import android.net.NetworkInfo; 10 | 11 | public class ConnectivityUtil { 12 | 13 | private final ConnectivityManager mConnectivityManager; 14 | 15 | public ConnectivityUtil(Context context) { 16 | mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 17 | } 18 | 19 | public boolean hasNetworkConnection() { 20 | NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); 21 | return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /android_app/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | maven{ 7 | url 'https://maven.google.com' 8 | } 9 | jcenter{ // add this repository 10 | url 'http://oss.jfrog.org/oss-snapshot-local' 11 | } 12 | } 13 | dependencies { 14 | classpath 'com.android.tools.build:gradle:3.4.0' 15 | 16 | // NOTE: Do not place your application dependencies here; they belong 17 | // in the individual module build.gradle files 18 | } 19 | } 20 | 21 | allprojects { 22 | repositories { 23 | maven{ 24 | url 'https://maven.google.com' 25 | } 26 | jcenter{ // add this repository 27 | url 'http://oss.jfrog.org/oss-snapshot-local' 28 | } 29 | jcenter() 30 | mavenCentral() 31 | mavenLocal() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/view/CalendarFragmentPagerAdapter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.view; 6 | 7 | import android.support.v4.app.FragmentManager; 8 | import android.support.v4.app.FragmentStatePagerAdapter; 9 | 10 | import com.microsoft.office365.meetingfeedback.util.CalendarUtil; 11 | 12 | public class CalendarFragmentPagerAdapter extends FragmentStatePagerAdapter { 13 | 14 | public CalendarFragmentPagerAdapter(FragmentManager fm) { 15 | super(fm); 16 | } 17 | 18 | @Override 19 | public CalendarPageFragment getItem(int position) { 20 | return CalendarPageFragment.newInstance(position); 21 | } 22 | 23 | @Override 24 | public int getCount() { 25 | return CalendarUtil.NUM_PAGES_IN_CALENDAR; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/webservice/payload/CreateRatingRequest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.webservice.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | import com.microsoft.office365.meetingfeedback.model.meeting.RatingData; 9 | 10 | public class CreateRatingRequest { 11 | 12 | @SerializedName("event_id") 13 | public final String mEventId; 14 | 15 | @SerializedName("owner") 16 | public final String mEventOwner; 17 | 18 | @SerializedName("rating") 19 | public final RatingData mRatingData; 20 | 21 | public CreateRatingRequest(String eventId, String eventOwner, RatingData ratingData) { 22 | mEventId = eventId; 23 | mEventOwner = eventOwner; 24 | mRatingData = ratingData; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 16dp 8 | 16dp 9 | 10 | 11 | 8dp 12 | 16dp 13 | 24dp 14 | 15 | 16 | 4dp 17 | 12dp 18 | 16sp 19 | 14sp 20 | 18sp 21 | 22 | 23 | -------------------------------------------------------------------------------- /android_app/app/src/main/java/com/microsoft/office365/meetingfeedback/model/outlook/payload/Event.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | package com.microsoft.office365.meetingfeedback.model.outlook.payload; 6 | 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | public class Event { 10 | 11 | @SerializedName("iCalUId") 12 | public String mICalUId; 13 | 14 | @SerializedName("subject") 15 | public String mSubject; 16 | 17 | @SerializedName("start") 18 | public Date mStart; 19 | 20 | @SerializedName("end") 21 | public Date mEnd; 22 | 23 | @SerializedName("organizer") 24 | public Organizer mOrganizer; 25 | 26 | @SerializedName("isOrganizer") 27 | public boolean mIsOrganizer; 28 | 29 | @SerializedName("attendees") 30 | public Attendee[] mAttendees; 31 | 32 | @SerializedName("bodyPreview") 33 | public String mBodyPreview; 34 | 35 | } 36 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | android: 3 | components: 4 | - tools 5 | - platform-tools 6 | - extra 7 | - android-28 8 | - build-tools-28.0.0 9 | script: 10 | - ./android_app/gradlew clean build -p android_app/app/ 11 | notifications: 12 | slack: 13 | secure: baYp2E1zWyGfFMD/7yhrKi9XNy28ryL4dnTybNouOXcoEPy8f+XDD/AkavZ2BqPK+w1407OhgIzB0lkQqcKErUN9Vl1x6tixdmc42Wb4uZ7tle6u2EDuOud8Rl8rOeMQCXz03J8F2RtdkbUZJuPkp40jbpw3Og9RPqIs7wEQAEoeqtjquZD94xwwK7WG+2plZqFm6zUqpl4wWXjSSY0cnqDj0xQjG5A6d2OLNj7z4Kp/MODMavJtfhqUyNnCML21GLlUkE3D67A1n36Jc7bNuNTaoho0D2vxmJftW3RinLS6HW0HdR+vH9+acvuB4t4cc6NejYaJiVXS9HTfD//uexxCHTPUOSmL6KPC3xzIHU/BnPwona/jZLwYk3enPp0UyNKi+bzBKaaGgUl0pnnWYbou+uDxpQdDB1KIQDdWGk90ykwSklHqUHkvCrUiAnDUbR1OqksDiOfVTSySQMIMVHaUJSTmL5HjYrYCAtyUOY+gSVZ85WjLJjjZp3d3dh+3ZUvQZLUUFNe2E3FZ4BORpeYLD8sKPeH/RTmXYnvjnHhGpDsJAg/tk4dEWjNKkVRfMpy8UydJ/OGkajnOy01kedzI7MeAhPy/uQtTQ1sDxU5qwWWJOOQrVc/+/WLAIIyAwglfmasIK0q6OqYjve7QPhjXh2kYR4kHRO6NlU6WUNs= 14 | email: 15 | recipients: 16 | - jak@microsoft.com 17 | on_success: never 18 | on_failure: always 19 | -------------------------------------------------------------------------------- /webservice/config/secrets.yml: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key is used for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | 6 | # Make sure the secret is at least 30 characters and all random, 7 | # no regular words or you'll be exposed to dictionary attacks. 8 | # You can use `rake secret` to generate a secure secret key. 9 | 10 | # Make sure the secrets in this file are kept private 11 | # if you're sharing your code publicly. 12 | 13 | development: 14 | secret_key_base: 4783bebe357be4f0f06743dcd07ff07dfcbb35f360fd7eb651d9fab01f695e4242e18732aed935bbef5047be2fffe798ed4b6d889106a918cae6d9f75cde3c64 15 | 16 | test: 17 | secret_key_base: f7c2d67eff6523a14ca8772ae5948701403a306d5bd1ece2607d99094fe6f5795c0fcbac7a1bf0a05ffefd31d6eda8630a548e324402166d11315221d5705aa0 18 | 19 | # Do not keep production secrets in the repository, 20 | # instead read values from the environment. 21 | production: 22 | secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 23 | -------------------------------------------------------------------------------- /android_app/app/src/main/res/layout/activity_no_network_activity.xml: -------------------------------------------------------------------------------- 1 | 5 | 10 | 11 | 19 | 20 |