init
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
*.iml
|
||||||
|
.gradle
|
||||||
|
/local.properties
|
||||||
|
/.idea/workspace.xml
|
||||||
|
/.idea/libraries
|
||||||
|
.DS_Store
|
||||||
|
/build
|
||||||
|
/captures
|
1
.idea/.name
Normal file
@ -0,0 +1 @@
|
|||||||
|
TrainTimes
|
22
.idea/compiler.xml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<resourceExtensions />
|
||||||
|
<wildcardResourcePatterns>
|
||||||
|
<entry name="!?*.java" />
|
||||||
|
<entry name="!?*.form" />
|
||||||
|
<entry name="!?*.class" />
|
||||||
|
<entry name="!?*.groovy" />
|
||||||
|
<entry name="!?*.scala" />
|
||||||
|
<entry name="!?*.flex" />
|
||||||
|
<entry name="!?*.kt" />
|
||||||
|
<entry name="!?*.clj" />
|
||||||
|
<entry name="!?*.aj" />
|
||||||
|
</wildcardResourcePatterns>
|
||||||
|
<annotationProcessing>
|
||||||
|
<profile default="true" name="Default" enabled="false">
|
||||||
|
<processorPath useClasspath="true" />
|
||||||
|
</profile>
|
||||||
|
</annotationProcessing>
|
||||||
|
</component>
|
||||||
|
</project>
|
3
.idea/copyright/profiles_settings.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<component name="CopyrightManager">
|
||||||
|
<settings default="" />
|
||||||
|
</component>
|
6
.idea/encodings.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding">
|
||||||
|
<file url="PROJECT" charset="UTF-8" />
|
||||||
|
</component>
|
||||||
|
</project>
|
18
.idea/gradle.xml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GradleSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<GradleProjectSettings>
|
||||||
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="gradleJvm" value="1.8" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
<option value="$PROJECT_DIR$/app" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</GradleProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
46
.idea/misc.xml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="EntryPointsManager">
|
||||||
|
<entry_points version="2.0" />
|
||||||
|
</component>
|
||||||
|
<component name="NullableNotNullManager">
|
||||||
|
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
|
||||||
|
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
|
||||||
|
<option name="myNullables">
|
||||||
|
<value>
|
||||||
|
<list size="4">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
|
||||||
|
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
|
||||||
|
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
|
||||||
|
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="myNotNulls">
|
||||||
|
<value>
|
||||||
|
<list size="4">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
|
||||||
|
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
|
||||||
|
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
|
||||||
|
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
|
||||||
|
<OptionsSetting value="true" id="Add" />
|
||||||
|
<OptionsSetting value="true" id="Remove" />
|
||||||
|
<OptionsSetting value="true" id="Checkout" />
|
||||||
|
<OptionsSetting value="true" id="Update" />
|
||||||
|
<OptionsSetting value="true" id="Status" />
|
||||||
|
<OptionsSetting value="true" id="Edit" />
|
||||||
|
<ConfirmationsSetting value="0" id="Add" />
|
||||||
|
<ConfirmationsSetting value="0" id="Remove" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectType">
|
||||||
|
<option name="id" value="Android" />
|
||||||
|
</component>
|
||||||
|
</project>
|
9
.idea/modules.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/TrainTimes.iml" filepath="$PROJECT_DIR$/TrainTimes.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
12
.idea/runConfigurations.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RunConfigurationProducerService">
|
||||||
|
<option name="ignoredProducers">
|
||||||
|
<set>
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="" />
|
||||||
|
</component>
|
||||||
|
</project>
|
1
app/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build
|
26
app/build.gradle
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 23
|
||||||
|
buildToolsVersion "23.0.1"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.silvrtree.traintimes"
|
||||||
|
minSdkVersion 21
|
||||||
|
targetSdkVersion 23
|
||||||
|
versionCode 1
|
||||||
|
versionName "1.0"
|
||||||
|
}
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
testCompile 'junit:junit:4.12'
|
||||||
|
compile 'com.android.support:appcompat-v7:23.1.1'
|
||||||
|
}
|
17
app/proguard-rules.pro
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in C:\Users\marti\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the proguardFiles
|
||||||
|
# directive in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.silvrtree.traintimes;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.test.ApplicationTestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
|
||||||
|
*/
|
||||||
|
public class ApplicationTest extends ApplicationTestCase<Application> {
|
||||||
|
public ApplicationTest() {
|
||||||
|
super(Application.class);
|
||||||
|
}
|
||||||
|
}
|
24
app/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.silvrtree.traintimes">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/AppTheme">
|
||||||
|
<activity android:name=".MainActivity" android:label="@string/app_name"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
android:configChanges="keyboardHidden|orientation|screenSize">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
||||||
|
</manifest>
|
BIN
app/src/main/assets/assets/active_departure.png
Normal file
After Width: | Height: | Size: 364 B |
BIN
app/src/main/assets/assets/active_stop.png
Normal file
After Width: | Height: | Size: 317 B |
BIN
app/src/main/assets/assets/active_terminate.png
Normal file
After Width: | Height: | Size: 365 B |
BIN
app/src/main/assets/assets/fm-old.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
app/src/main/assets/assets/fm.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
app/src/main/assets/assets/previous_departure.png
Normal file
After Width: | Height: | Size: 357 B |
BIN
app/src/main/assets/assets/previous_stop.png
Normal file
After Width: | Height: | Size: 361 B |
BIN
app/src/main/assets/assets/previous_terminate.png
Normal file
After Width: | Height: | Size: 353 B |
BIN
app/src/main/assets/assets/tf_small_pale.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
76
app/src/main/assets/css/normalize-min.css
vendored
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}
|
||||||
|
body{margin:0;}
|
||||||
|
article,
|
||||||
|
aside,
|
||||||
|
details,
|
||||||
|
figcaption,
|
||||||
|
figure,
|
||||||
|
footer,
|
||||||
|
header,
|
||||||
|
hgroup,
|
||||||
|
main,
|
||||||
|
menu,
|
||||||
|
nav,
|
||||||
|
section,
|
||||||
|
summary{display:block;}
|
||||||
|
audio,
|
||||||
|
canvas,
|
||||||
|
progress,
|
||||||
|
video{display:inline-block;vertical-align:baseline;}
|
||||||
|
audio:not([controls]){display:none;height:0;}
|
||||||
|
[hidden],
|
||||||
|
template{display:none;}
|
||||||
|
a{background-color:transparent;}
|
||||||
|
a:active,
|
||||||
|
a:hover{outline:0;}
|
||||||
|
abbr[title]{border-bottom:1px dotted;}
|
||||||
|
b,
|
||||||
|
strong{font-weight:bold;}
|
||||||
|
dfn{font-style:italic;}
|
||||||
|
h1{font-size:2em;margin:0.67em 0;}
|
||||||
|
mark{background:#ff0;color:#000;}
|
||||||
|
small{font-size:80%;}
|
||||||
|
sub,
|
||||||
|
sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}
|
||||||
|
sup{top:-0.5em;}
|
||||||
|
sub{bottom:-0.25em;}
|
||||||
|
img{border:0;}
|
||||||
|
svg:not(:root){overflow:hidden;}
|
||||||
|
figure{margin:1em 40px;}
|
||||||
|
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}
|
||||||
|
pre{overflow:auto;}
|
||||||
|
code,
|
||||||
|
kbd,
|
||||||
|
pre,
|
||||||
|
samp{font-family:monospace, monospace;font-size:1em;}
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
optgroup,
|
||||||
|
select,
|
||||||
|
textarea{color:inherit;font:inherit;margin:0;}
|
||||||
|
button{overflow:visible;}
|
||||||
|
button,
|
||||||
|
select{text-transform:none;}
|
||||||
|
button,
|
||||||
|
html input[type="button"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
|
||||||
|
button[disabled],
|
||||||
|
html input[disabled]{cursor:default;}
|
||||||
|
button::-moz-focus-inner,
|
||||||
|
input::-moz-focus-inner{border:0;padding:0;}
|
||||||
|
input{line-height:normal;}
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"]{box-sizing:border-box;padding:0;}
|
||||||
|
input[type="number"]::-webkit-inner-spin-button,
|
||||||
|
input[type="number"]::-webkit-outer-spin-button{height:auto;}
|
||||||
|
input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}
|
||||||
|
input[type="search"]::-webkit-search-cancel-button,
|
||||||
|
input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}
|
||||||
|
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}
|
||||||
|
legend{border:0;padding:0;}
|
||||||
|
textarea{overflow:auto;}
|
||||||
|
optgroup{font-weight:bold;}
|
||||||
|
table{border-collapse:collapse;border-spacing:0;}
|
||||||
|
td,
|
||||||
|
th{padding:0;}
|
427
app/src/main/assets/css/normalize.css
vendored
Normal file
@ -0,0 +1,427 @@
|
|||||||
|
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Set default font family to sans-serif.
|
||||||
|
* 2. Prevent iOS text size adjust after orientation change, without disabling
|
||||||
|
* user zoom.
|
||||||
|
*/
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-family: sans-serif; /* 1 */
|
||||||
|
-ms-text-size-adjust: 100%; /* 2 */
|
||||||
|
-webkit-text-size-adjust: 100%; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove default margin.
|
||||||
|
*/
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HTML5 display definitions
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct `block` display not defined for any HTML5 element in IE 8/9.
|
||||||
|
* Correct `block` display not defined for `details` or `summary` in IE 10/11
|
||||||
|
* and Firefox.
|
||||||
|
* Correct `block` display not defined for `main` in IE 11.
|
||||||
|
*/
|
||||||
|
|
||||||
|
article,
|
||||||
|
aside,
|
||||||
|
details,
|
||||||
|
figcaption,
|
||||||
|
figure,
|
||||||
|
footer,
|
||||||
|
header,
|
||||||
|
hgroup,
|
||||||
|
main,
|
||||||
|
menu,
|
||||||
|
nav,
|
||||||
|
section,
|
||||||
|
summary {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct `inline-block` display not defined in IE 8/9.
|
||||||
|
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
|
||||||
|
*/
|
||||||
|
|
||||||
|
audio,
|
||||||
|
canvas,
|
||||||
|
progress,
|
||||||
|
video {
|
||||||
|
display: inline-block; /* 1 */
|
||||||
|
vertical-align: baseline; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent modern browsers from displaying `audio` without controls.
|
||||||
|
* Remove excess height in iOS 5 devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
audio:not([controls]) {
|
||||||
|
display: none;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address `[hidden]` styling not present in IE 8/9/10.
|
||||||
|
* Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
|
||||||
|
*/
|
||||||
|
|
||||||
|
[hidden],
|
||||||
|
template {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Links
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the gray background color from active links in IE 10.
|
||||||
|
*/
|
||||||
|
|
||||||
|
a {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Improve readability when focused and also mouse hovered in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
a:active,
|
||||||
|
a:hover {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Text-level semantics
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address styling not present in IE 8/9/10/11, Safari, and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
abbr[title] {
|
||||||
|
border-bottom: 1px dotted;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
b,
|
||||||
|
strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address styling not present in Safari and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dfn {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address variable `h1` font-size and margin within `section` and `article`
|
||||||
|
* contexts in Firefox 4+, Safari, and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
margin: 0.67em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address styling not present in IE 8/9.
|
||||||
|
*/
|
||||||
|
|
||||||
|
mark {
|
||||||
|
background: #ff0;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address inconsistent and variable font size in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sub,
|
||||||
|
sup {
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 0;
|
||||||
|
position: relative;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
top: -0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
bottom: -0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Embedded content
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove border when inside `a` element in IE 8/9/10.
|
||||||
|
*/
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct overflow not hidden in IE 9/10/11.
|
||||||
|
*/
|
||||||
|
|
||||||
|
svg:not(:root) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Grouping content
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address margin not present in IE 8/9 and Safari.
|
||||||
|
*/
|
||||||
|
|
||||||
|
figure {
|
||||||
|
margin: 1em 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address differences between Firefox and other browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
hr {
|
||||||
|
-moz-box-sizing: content-box;
|
||||||
|
box-sizing: content-box;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contain overflow in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address odd `em`-unit font size rendering in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
code,
|
||||||
|
kbd,
|
||||||
|
pre,
|
||||||
|
samp {
|
||||||
|
font-family: monospace, monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Forms
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Known limitation: by default, Chrome and Safari on OS X allow very limited
|
||||||
|
* styling of `select`, unless a `border` property is set.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct color not being inherited.
|
||||||
|
* Known issue: affects color of disabled elements.
|
||||||
|
* 2. Correct font properties not being inherited.
|
||||||
|
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
optgroup,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
color: inherit; /* 1 */
|
||||||
|
font: inherit; /* 2 */
|
||||||
|
margin: 0; /* 3 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address `overflow` set to `hidden` in IE 8/9/10/11.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address inconsistent `text-transform` inheritance for `button` and `select`.
|
||||||
|
* All other form control elements do not inherit `text-transform` values.
|
||||||
|
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
|
||||||
|
* Correct `select` style inheritance in Firefox.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
select {
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
||||||
|
* and `video` controls.
|
||||||
|
* 2. Correct inability to style clickable `input` types in iOS.
|
||||||
|
* 3. Improve usability and consistency of cursor style between image-type
|
||||||
|
* `input` and others.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
html input[type="button"], /* 1 */
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="submit"] {
|
||||||
|
-webkit-appearance: button; /* 2 */
|
||||||
|
cursor: pointer; /* 3 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-set default cursor for disabled elements.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button[disabled],
|
||||||
|
html input[disabled] {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove inner padding and border in Firefox 4+.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button::-moz-focus-inner,
|
||||||
|
input::-moz-focus-inner {
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
||||||
|
* the UA stylesheet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
input {
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It's recommended that you don't attempt to style these elements.
|
||||||
|
* Firefox's implementation doesn't respect box-sizing, padding, or width.
|
||||||
|
*
|
||||||
|
* 1. Address box sizing set to `content-box` in IE 8/9/10.
|
||||||
|
* 2. Remove excess padding in IE 8/9/10.
|
||||||
|
*/
|
||||||
|
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"] {
|
||||||
|
box-sizing: border-box; /* 1 */
|
||||||
|
padding: 0; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
|
||||||
|
* `font-size` values of the `input`, it causes the cursor style of the
|
||||||
|
* decrement button to change from `default` to `text`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
input[type="number"]::-webkit-inner-spin-button,
|
||||||
|
input[type="number"]::-webkit-outer-spin-button {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Address `appearance` set to `searchfield` in Safari and Chrome.
|
||||||
|
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome
|
||||||
|
* (include `-moz` to future-proof).
|
||||||
|
*/
|
||||||
|
|
||||||
|
input[type="search"] {
|
||||||
|
-webkit-appearance: textfield; /* 1 */
|
||||||
|
-moz-box-sizing: content-box;
|
||||||
|
-webkit-box-sizing: content-box; /* 2 */
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
|
||||||
|
* Safari (but not Chrome) clips the cancel button when the search input has
|
||||||
|
* padding (and `textfield` appearance).
|
||||||
|
*/
|
||||||
|
|
||||||
|
input[type="search"]::-webkit-search-cancel-button,
|
||||||
|
input[type="search"]::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define consistent border, margin, and padding.
|
||||||
|
*/
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
border: 1px solid #c0c0c0;
|
||||||
|
margin: 0 2px;
|
||||||
|
padding: 0.35em 0.625em 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct `color` not being inherited in IE 8/9/10/11.
|
||||||
|
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
||||||
|
*/
|
||||||
|
|
||||||
|
legend {
|
||||||
|
border: 0; /* 1 */
|
||||||
|
padding: 0; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove default vertical scrollbar in IE 8/9/10/11.
|
||||||
|
*/
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Don't inherit the `font-weight` (applied by a rule above).
|
||||||
|
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
|
||||||
|
*/
|
||||||
|
|
||||||
|
optgroup {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tables
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove most spacing between table cells.
|
||||||
|
*/
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
td,
|
||||||
|
th {
|
||||||
|
padding: 0;
|
||||||
|
}
|
181
app/src/main/assets/css/skeleton-min.css
vendored
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
.container{position:relative;width:100%;max-width:960px;margin:0 auto;padding:0 20px;box-sizing:border-box;}
|
||||||
|
.column,
|
||||||
|
.columns{width:100%;float:left;box-sizing:border-box;}
|
||||||
|
@media (min-width:400px){.container{width:85%;padding:0;}
|
||||||
|
}
|
||||||
|
@media (min-width:550px){.container{width:80%;}
|
||||||
|
.column,
|
||||||
|
.columns{margin-left:4%;}
|
||||||
|
.column:first-child,
|
||||||
|
.columns:first-child{margin-left:0;}
|
||||||
|
.one.column,
|
||||||
|
.one.columns{width:4.66666666667%;}
|
||||||
|
.two.columns{width:13.3333333333%;}
|
||||||
|
.three.columns{width:22%;}
|
||||||
|
.four.columns{width:30.6666666667%;}
|
||||||
|
.five.columns{width:39.3333333333%;}
|
||||||
|
.six.columns{width:48%;}
|
||||||
|
.seven.columns{width:56.6666666667%;}
|
||||||
|
.eight.columns{width:65.3333333333%;}
|
||||||
|
.nine.columns{width:74.0%;}
|
||||||
|
.ten.columns{width:82.6666666667%;}
|
||||||
|
.eleven.columns{width:91.3333333333%;}
|
||||||
|
.twelve.columns{width:100%;margin-left:0;}
|
||||||
|
.one-third.column{width:30.6666666667%;}
|
||||||
|
.two-thirds.column{width:65.3333333333%;}
|
||||||
|
.one-half.column{width:48%;}
|
||||||
|
.offset-by-one.column,
|
||||||
|
.offset-by-one.columns{margin-left:8.66666666667%;}
|
||||||
|
.offset-by-two.column,
|
||||||
|
.offset-by-two.columns{margin-left:17.3333333333%;}
|
||||||
|
.offset-by-three.column,
|
||||||
|
.offset-by-three.columns{margin-left:26%;}
|
||||||
|
.offset-by-four.column,
|
||||||
|
.offset-by-four.columns{margin-left:34.6666666667%;}
|
||||||
|
.offset-by-five.column,
|
||||||
|
.offset-by-five.columns{margin-left:43.3333333333%;}
|
||||||
|
.offset-by-six.column,
|
||||||
|
.offset-by-six.columns{margin-left:52%;}
|
||||||
|
.offset-by-seven.column,
|
||||||
|
.offset-by-seven.columns{margin-left:60.6666666667%;}
|
||||||
|
.offset-by-eight.column,
|
||||||
|
.offset-by-eight.columns{margin-left:69.3333333333%;}
|
||||||
|
.offset-by-nine.column,
|
||||||
|
.offset-by-nine.columns{margin-left:78.0%;}
|
||||||
|
.offset-by-ten.column,
|
||||||
|
.offset-by-ten.columns{margin-left:86.6666666667%;}
|
||||||
|
.offset-by-eleven.column,
|
||||||
|
.offset-by-eleven.columns{margin-left:95.3333333333%;}
|
||||||
|
.offset-by-one-third.column,
|
||||||
|
.offset-by-one-third.columns{margin-left:34.6666666667%;}
|
||||||
|
.offset-by-two-thirds.column,
|
||||||
|
.offset-by-two-thirds.columns{margin-left:69.3333333333%;}
|
||||||
|
.offset-by-one-half.column,
|
||||||
|
.offset-by-one-half.columns{margin-left:52%;}
|
||||||
|
}
|
||||||
|
html{font-size:62.5%;}
|
||||||
|
body{font-size:1.5em;line-height:1.6;font-weight:400;font-family:"Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;color:#222;}
|
||||||
|
h1, h2, h3, h4, h5, h6{margin-top:0;margin-bottom:2rem;font-weight:300;}
|
||||||
|
h1{font-size:4.0rem;line-height:1.2;letter-spacing:-.1rem;}
|
||||||
|
h2{font-size:3.6rem;line-height:1.25;letter-spacing:-.1rem;}
|
||||||
|
h3{font-size:3.0rem;line-height:1.3;letter-spacing:-.1rem;}
|
||||||
|
h4{font-size:2.4rem;line-height:1.35;letter-spacing:-.08rem;}
|
||||||
|
h5{font-size:1.8rem;line-height:1.5;letter-spacing:-.05rem;}
|
||||||
|
h6{font-size:1.5rem;line-height:1.6;letter-spacing:0;}
|
||||||
|
@media (min-width:550px){h1{font-size:5.0rem;}
|
||||||
|
h2{font-size:4.2rem;}
|
||||||
|
h3{font-size:3.6rem;}
|
||||||
|
h4{font-size:3.0rem;}
|
||||||
|
h5{font-size:2.4rem;}
|
||||||
|
h6{font-size:1.5rem;}
|
||||||
|
}
|
||||||
|
p{margin-top:0;}
|
||||||
|
a{color:#1EAEDB;}
|
||||||
|
a:hover{color:#0FA0CE;}
|
||||||
|
.button,
|
||||||
|
button,
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="button"]{display:inline-block;height:38px;padding:0 30px;color:#555;text-align:center;font-size:11px;font-weight:600;line-height:38px;letter-spacing:.1rem;text-transform:uppercase;text-decoration:none;white-space:nowrap;background-color:transparent;border-radius:4px;border:1px solid #bbb;cursor:pointer;box-sizing:border-box;}
|
||||||
|
.button:hover,
|
||||||
|
button:hover,
|
||||||
|
input[type="submit"]:hover,
|
||||||
|
input[type="reset"]:hover,
|
||||||
|
input[type="button"]:hover,
|
||||||
|
.button:focus,
|
||||||
|
button:focus,
|
||||||
|
input[type="submit"]:focus,
|
||||||
|
input[type="reset"]:focus,
|
||||||
|
input[type="button"]:focus{color:#333;border-color:#888;outline:0;}
|
||||||
|
.button.button-primary,
|
||||||
|
button.button-primary,
|
||||||
|
input[type="submit"].button-primary,
|
||||||
|
input[type="reset"].button-primary,
|
||||||
|
input[type="button"].button-primary{color:#FFF;background-color:#33C3F0;border-color:#33C3F0;}
|
||||||
|
.button.button-primary:hover,
|
||||||
|
button.button-primary:hover,
|
||||||
|
input[type="submit"].button-primary:hover,
|
||||||
|
input[type="reset"].button-primary:hover,
|
||||||
|
input[type="button"].button-primary:hover,
|
||||||
|
.button.button-primary:focus,
|
||||||
|
button.button-primary:focus,
|
||||||
|
input[type="submit"].button-primary:focus,
|
||||||
|
input[type="reset"].button-primary:focus,
|
||||||
|
input[type="button"].button-primary:focus{color:#FFF;background-color:#1EAEDB;border-color:#1EAEDB;}
|
||||||
|
input[type="email"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="password"],
|
||||||
|
textarea,
|
||||||
|
select{height:38px;padding:6px 10px;background-color:#fff;border:1px solid #D1D1D1;border-radius:4px;box-shadow:none;box-sizing:border-box;}
|
||||||
|
input[type="email"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="password"],
|
||||||
|
textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;}
|
||||||
|
textarea{min-height:65px;padding-top:6px;padding-bottom:6px;}
|
||||||
|
input[type="email"]:focus,
|
||||||
|
input[type="number"]:focus,
|
||||||
|
input[type="search"]:focus,
|
||||||
|
input[type="text"]:focus,
|
||||||
|
input[type="tel"]:focus,
|
||||||
|
input[type="url"]:focus,
|
||||||
|
input[type="password"]:focus,
|
||||||
|
textarea:focus,
|
||||||
|
select:focus{border:1px solid #33C3F0;outline:0;}
|
||||||
|
label,
|
||||||
|
legend{display:block;margin-bottom:.5rem;font-weight:600;}
|
||||||
|
fieldset{padding:0;border-width:0;}
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"]{display:inline;}
|
||||||
|
label > .label-body{display:inline-block;margin-left:.5rem;font-weight:normal;}
|
||||||
|
ul{list-style:circle inside;}
|
||||||
|
ol{list-style:decimal inside;}
|
||||||
|
ol, ul{padding-left:0;margin-top:0;}
|
||||||
|
ul ul,
|
||||||
|
ul ol,
|
||||||
|
ol ol,
|
||||||
|
ol ul{margin:1.5rem 0 1.7rem 3rem;font-size:90%;}
|
||||||
|
li{margin-bottom:1rem;}
|
||||||
|
code{padding:.2rem .5rem;margin:0 .2rem;font-size:90%;white-space:nowrap;background:#F1F1F1;border:1px solid #E1E1E1;border-radius:4px;}
|
||||||
|
pre > code{display:block;padding:1rem 1.5rem;white-space:pre;}
|
||||||
|
th,
|
||||||
|
td{padding:12px 15px;text-align:left;border-bottom:1px solid #E1E1E1;}
|
||||||
|
th:first-child,
|
||||||
|
td:first-child{padding-left:0;}
|
||||||
|
th:last-child,
|
||||||
|
td:last-child{padding-right:0;}
|
||||||
|
button,
|
||||||
|
.button{margin-bottom:1rem;}
|
||||||
|
input,
|
||||||
|
textarea,
|
||||||
|
select,
|
||||||
|
fieldset{margin-bottom:1.5rem;}
|
||||||
|
pre,
|
||||||
|
blockquote,
|
||||||
|
dl,
|
||||||
|
figure,
|
||||||
|
table,
|
||||||
|
p,
|
||||||
|
ul,
|
||||||
|
ol,
|
||||||
|
form{margin-bottom:2.5rem;}
|
||||||
|
.u-full-width{width:100%;box-sizing:border-box;}
|
||||||
|
.u-max-full-width{max-width:100%;box-sizing:border-box;}
|
||||||
|
.u-pull-right{float:right;}
|
||||||
|
.u-pull-left{float:left;}
|
||||||
|
hr{margin-top:3rem;margin-bottom:3.5rem;border-width:0;border-top:1px solid #E1E1E1;}
|
||||||
|
.container:after,
|
||||||
|
.row:after,
|
||||||
|
.u-cf{content:"";display:table;clear:both;}
|
||||||
|
@media (min-width:400px){}
|
||||||
|
@media (min-width:550px){}
|
||||||
|
@media (min-width:750px){}
|
||||||
|
@media (min-width:1000px){}
|
||||||
|
@media (min-width:1200px){}
|
418
app/src/main/assets/css/skeleton.css
vendored
Normal file
@ -0,0 +1,418 @@
|
|||||||
|
/*
|
||||||
|
* Skeleton V2.0.4
|
||||||
|
* Copyright 2014, Dave Gamache
|
||||||
|
* www.getskeleton.com
|
||||||
|
* Free to use under the MIT license.
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
* 12/29/2014
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Table of contents
|
||||||
|
––––––––––––––––––––––––––––––––––––––––––––––––––
|
||||||
|
- Grid
|
||||||
|
- Base Styles
|
||||||
|
- Typography
|
||||||
|
- Links
|
||||||
|
- Buttons
|
||||||
|
- Forms
|
||||||
|
- Lists
|
||||||
|
- Code
|
||||||
|
- Tables
|
||||||
|
- Spacing
|
||||||
|
- Utilities
|
||||||
|
- Clearing
|
||||||
|
- Media Queries
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Grid
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
.container {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 960px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0 20px;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.column,
|
||||||
|
.columns {
|
||||||
|
width: 100%;
|
||||||
|
float: left;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
|
||||||
|
/* For devices larger than 400px */
|
||||||
|
@media (min-width: 400px) {
|
||||||
|
.container {
|
||||||
|
width: 85%;
|
||||||
|
padding: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For devices larger than 550px */
|
||||||
|
@media (min-width: 550px) {
|
||||||
|
.container {
|
||||||
|
width: 80%; }
|
||||||
|
.column,
|
||||||
|
.columns {
|
||||||
|
margin-left: 4%; }
|
||||||
|
.column:first-child,
|
||||||
|
.columns:first-child {
|
||||||
|
margin-left: 0; }
|
||||||
|
|
||||||
|
.one.column,
|
||||||
|
.one.columns { width: 4.66666666667%; }
|
||||||
|
.two.columns { width: 13.3333333333%; }
|
||||||
|
.three.columns { width: 22%; }
|
||||||
|
.four.columns { width: 30.6666666667%; }
|
||||||
|
.five.columns { width: 39.3333333333%; }
|
||||||
|
.six.columns { width: 48%; }
|
||||||
|
.seven.columns { width: 56.6666666667%; }
|
||||||
|
.eight.columns { width: 65.3333333333%; }
|
||||||
|
.nine.columns { width: 74.0%; }
|
||||||
|
.ten.columns { width: 82.6666666667%; }
|
||||||
|
.eleven.columns { width: 91.3333333333%; }
|
||||||
|
.twelve.columns { width: 100%; margin-left: 0; }
|
||||||
|
|
||||||
|
.one-third.column { width: 30.6666666667%; }
|
||||||
|
.two-thirds.column { width: 65.3333333333%; }
|
||||||
|
|
||||||
|
.one-half.column { width: 48%; }
|
||||||
|
|
||||||
|
/* Offsets */
|
||||||
|
.offset-by-one.column,
|
||||||
|
.offset-by-one.columns { margin-left: 8.66666666667%; }
|
||||||
|
.offset-by-two.column,
|
||||||
|
.offset-by-two.columns { margin-left: 17.3333333333%; }
|
||||||
|
.offset-by-three.column,
|
||||||
|
.offset-by-three.columns { margin-left: 26%; }
|
||||||
|
.offset-by-four.column,
|
||||||
|
.offset-by-four.columns { margin-left: 34.6666666667%; }
|
||||||
|
.offset-by-five.column,
|
||||||
|
.offset-by-five.columns { margin-left: 43.3333333333%; }
|
||||||
|
.offset-by-six.column,
|
||||||
|
.offset-by-six.columns { margin-left: 52%; }
|
||||||
|
.offset-by-seven.column,
|
||||||
|
.offset-by-seven.columns { margin-left: 60.6666666667%; }
|
||||||
|
.offset-by-eight.column,
|
||||||
|
.offset-by-eight.columns { margin-left: 69.3333333333%; }
|
||||||
|
.offset-by-nine.column,
|
||||||
|
.offset-by-nine.columns { margin-left: 78.0%; }
|
||||||
|
.offset-by-ten.column,
|
||||||
|
.offset-by-ten.columns { margin-left: 86.6666666667%; }
|
||||||
|
.offset-by-eleven.column,
|
||||||
|
.offset-by-eleven.columns { margin-left: 95.3333333333%; }
|
||||||
|
|
||||||
|
.offset-by-one-third.column,
|
||||||
|
.offset-by-one-third.columns { margin-left: 34.6666666667%; }
|
||||||
|
.offset-by-two-thirds.column,
|
||||||
|
.offset-by-two-thirds.columns { margin-left: 69.3333333333%; }
|
||||||
|
|
||||||
|
.offset-by-one-half.column,
|
||||||
|
.offset-by-one-half.columns { margin-left: 52%; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Base Styles
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
/* NOTE
|
||||||
|
html is set to 62.5% so that all the REM measurements throughout Skeleton
|
||||||
|
are based on 10px sizing. So basically 1.5rem = 15px :) */
|
||||||
|
html {
|
||||||
|
font-size: 62.5%; }
|
||||||
|
body {
|
||||||
|
font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */
|
||||||
|
line-height: 1.6;
|
||||||
|
font-weight: 400;
|
||||||
|
font-family: 'Roboto Slab', "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
color: #222; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Typography
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
font-weight: 300; }
|
||||||
|
h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;}
|
||||||
|
h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }
|
||||||
|
h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; }
|
||||||
|
h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }
|
||||||
|
h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; }
|
||||||
|
h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; }
|
||||||
|
|
||||||
|
/* Larger than phablet */
|
||||||
|
@media (min-width: 550px) {
|
||||||
|
h1 { font-size: 5.0rem; }
|
||||||
|
h2 { font-size: 4.2rem; }
|
||||||
|
h3 { font-size: 3.6rem; }
|
||||||
|
h4 { font-size: 3.0rem; }
|
||||||
|
h5 { font-size: 2.4rem; }
|
||||||
|
h6 { font-size: 1.5rem; }
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-top: 0; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Links
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
a {
|
||||||
|
color: #1EAEDB; }
|
||||||
|
a:hover {
|
||||||
|
color: #0FA0CE; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Buttons
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
.button,
|
||||||
|
button,
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="button"] {
|
||||||
|
display: inline-block;
|
||||||
|
height: 38px;
|
||||||
|
padding: 0 30px;
|
||||||
|
color: #555;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 38px;
|
||||||
|
letter-spacing: .1rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-decoration: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
background-color: transparent;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #bbb;
|
||||||
|
cursor: pointer;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.button:hover,
|
||||||
|
button:hover,
|
||||||
|
input[type="submit"]:hover,
|
||||||
|
input[type="reset"]:hover,
|
||||||
|
input[type="button"]:hover,
|
||||||
|
.button:focus,
|
||||||
|
button:focus,
|
||||||
|
input[type="submit"]:focus,
|
||||||
|
input[type="reset"]:focus,
|
||||||
|
input[type="button"]:focus {
|
||||||
|
color: #333;
|
||||||
|
border-color: #888;
|
||||||
|
outline: 0; }
|
||||||
|
.button.button-primary,
|
||||||
|
button.button-primary,
|
||||||
|
input[type="submit"].button-primary,
|
||||||
|
input[type="reset"].button-primary,
|
||||||
|
input[type="button"].button-primary {
|
||||||
|
color: #FFF;
|
||||||
|
background-color: #33C3F0;
|
||||||
|
border-color: #33C3F0; }
|
||||||
|
.button.button-primary:hover,
|
||||||
|
button.button-primary:hover,
|
||||||
|
input[type="submit"].button-primary:hover,
|
||||||
|
input[type="reset"].button-primary:hover,
|
||||||
|
input[type="button"].button-primary:hover,
|
||||||
|
.button.button-primary:focus,
|
||||||
|
button.button-primary:focus,
|
||||||
|
input[type="submit"].button-primary:focus,
|
||||||
|
input[type="reset"].button-primary:focus,
|
||||||
|
input[type="button"].button-primary:focus {
|
||||||
|
color: #FFF;
|
||||||
|
background-color: #1EAEDB;
|
||||||
|
border-color: #1EAEDB; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Forms
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
input[type="email"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="password"],
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
height: 38px;
|
||||||
|
padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #D1D1D1;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: none;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
/* Removes awkward default styles on some inputs for iOS */
|
||||||
|
input[type="email"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="password"],
|
||||||
|
textarea {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none; }
|
||||||
|
textarea {
|
||||||
|
min-height: 65px;
|
||||||
|
padding-top: 6px;
|
||||||
|
padding-bottom: 6px; }
|
||||||
|
input[type="email"]:focus,
|
||||||
|
input[type="number"]:focus,
|
||||||
|
input[type="search"]:focus,
|
||||||
|
input[type="text"]:focus,
|
||||||
|
input[type="tel"]:focus,
|
||||||
|
input[type="url"]:focus,
|
||||||
|
input[type="password"]:focus,
|
||||||
|
textarea:focus,
|
||||||
|
select:focus {
|
||||||
|
border: 1px solid #33C3F0;
|
||||||
|
outline: 0; }
|
||||||
|
label,
|
||||||
|
legend {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
font-weight: 600; }
|
||||||
|
fieldset {
|
||||||
|
padding: 0;
|
||||||
|
border-width: 0; }
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"] {
|
||||||
|
display: inline; }
|
||||||
|
label > .label-body {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: .5rem;
|
||||||
|
font-weight: normal; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Lists
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
ul {
|
||||||
|
list-style: circle inside; }
|
||||||
|
ol {
|
||||||
|
list-style: decimal inside; }
|
||||||
|
ol, ul {
|
||||||
|
padding-left: 0;
|
||||||
|
margin-top: 0; }
|
||||||
|
ul ul,
|
||||||
|
ul ol,
|
||||||
|
ol ol,
|
||||||
|
ol ul {
|
||||||
|
margin: 1.5rem 0 1.5rem 3rem;
|
||||||
|
font-size: 90%; }
|
||||||
|
li {
|
||||||
|
margin-bottom: 1rem; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Code
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
code {
|
||||||
|
padding: .2rem .5rem;
|
||||||
|
margin: 0 .2rem;
|
||||||
|
font-size: 90%;
|
||||||
|
white-space: nowrap;
|
||||||
|
background: #F1F1F1;
|
||||||
|
border: 1px solid #E1E1E1;
|
||||||
|
border-radius: 4px; }
|
||||||
|
pre > code {
|
||||||
|
display: block;
|
||||||
|
padding: 1rem 1.5rem;
|
||||||
|
white-space: pre; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Tables
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
padding: 12px 15px;
|
||||||
|
text-align: left;
|
||||||
|
border-bottom: 1px solid #E1E1E1; }
|
||||||
|
th:first-child,
|
||||||
|
td:first-child {
|
||||||
|
padding-left: 0; }
|
||||||
|
th:last-child,
|
||||||
|
td:last-child {
|
||||||
|
padding-right: 0; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Spacing
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
button,
|
||||||
|
.button {
|
||||||
|
margin-bottom: 1rem; }
|
||||||
|
input,
|
||||||
|
textarea,
|
||||||
|
select,
|
||||||
|
fieldset {
|
||||||
|
margin-bottom: 1.5rem; }
|
||||||
|
pre,
|
||||||
|
blockquote,
|
||||||
|
dl,
|
||||||
|
figure,
|
||||||
|
table,
|
||||||
|
p,
|
||||||
|
ul,
|
||||||
|
ol,
|
||||||
|
form {
|
||||||
|
margin-bottom: 2.5rem; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Utilities
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
.u-full-width {
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.u-max-full-width {
|
||||||
|
max-width: 100%;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.u-pull-right {
|
||||||
|
float: right; }
|
||||||
|
.u-pull-left {
|
||||||
|
float: left; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
hr {
|
||||||
|
margin-top: 3rem;
|
||||||
|
margin-bottom: 3.5rem;
|
||||||
|
border-width: 0;
|
||||||
|
border-top: 1px solid #E1E1E1; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Clearing
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
|
||||||
|
/* Self Clearing Goodness */
|
||||||
|
.container:after,
|
||||||
|
.row:after,
|
||||||
|
.u-cf {
|
||||||
|
content: "";
|
||||||
|
display: table;
|
||||||
|
clear: both; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Media Queries
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
/*
|
||||||
|
Note: The best way to structure the use of media queries is to create the queries
|
||||||
|
near the relevant code. For example, if you wanted to change the styles for buttons
|
||||||
|
on small devices, paste the mobile query code up in the buttons section and style it
|
||||||
|
there.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Larger than mobile */
|
||||||
|
@media (min-width: 400px) {}
|
||||||
|
|
||||||
|
/* Larger than phablet (also point when grid becomes active) */
|
||||||
|
@media (min-width: 550px) {}
|
||||||
|
|
||||||
|
/* Larger than tablet */
|
||||||
|
@media (min-width: 750px) {}
|
||||||
|
|
||||||
|
/* Larger than desktop */
|
||||||
|
@media (min-width: 1000px) {}
|
||||||
|
|
||||||
|
/* Larger than Desktop HD */
|
||||||
|
@media (min-width: 1200px) {}
|
17
app/src/main/assets/ejs/propertrains.ejs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<div><%=locationName%> TO <%=filterLocationName%></div>
|
||||||
|
<table class="mui-table mui-table-bordered">
|
||||||
|
<tr><th>Destination</th>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Status</th>
|
||||||
|
<th>Platform</th></tr>
|
||||||
|
|
||||||
|
<% trainServices.forEach(function (item) { %>
|
||||||
|
<tr>
|
||||||
|
<td><%=item.destination[0].locationName%></td>
|
||||||
|
<td><%=item.sta%></td>
|
||||||
|
<td><%=item.eta%></td>
|
||||||
|
<td><%=item.platform%></td>
|
||||||
|
</tr>
|
||||||
|
<% }) %>
|
||||||
|
|
||||||
|
</table>
|
22
app/src/main/assets/ejs/routes.ejs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<%=locationName%>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<% if (previousCallingPoints !== null) {
|
||||||
|
previousCallingPoints[0].callingPoint.forEach(function (item) { %>
|
||||||
|
<tr>
|
||||||
|
<td><img src='assets/previous_stop.png'></td>
|
||||||
|
<td><%=item.locationName%></td>
|
||||||
|
</tr>
|
||||||
|
<% })}; %>
|
||||||
|
<tr>
|
||||||
|
<td><img src='assets/active_departure.png'></td>
|
||||||
|
<td><%=locationName%></td>
|
||||||
|
</tr>
|
||||||
|
<% if (subsequentCallingPoints !== null) {
|
||||||
|
subsequentCallingPoints[0].callingPoint.forEach(function (item) { %>
|
||||||
|
<tr>
|
||||||
|
<td><img src='assets/active_stop.png'></td>
|
||||||
|
<td><%=item.locationName%></td>
|
||||||
|
</tr>
|
||||||
|
<% })}; %>
|
||||||
|
</table>
|
18
app/src/main/assets/ejs/trains.ejs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<div><%=locationName%> TO <%=filterLocationName%></div>
|
||||||
|
<table class="mui-table mui-table-bordered" width='100%'>
|
||||||
|
<tr><th>Destination</th>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Status</th>
|
||||||
|
<th>Platform</th></tr>
|
||||||
|
|
||||||
|
<% if (trainServices !== null) {
|
||||||
|
trainServices.forEach(function (item) { %>
|
||||||
|
<tr onclick='javascript:setRoute("<%=item.serviceID%>")'>
|
||||||
|
<td><%=item.destination[0].locationName%></td>
|
||||||
|
<td><%=item.sta%></td>
|
||||||
|
<td><%=item.eta%></td>
|
||||||
|
<td><%=item.platform%></td>
|
||||||
|
</tr>
|
||||||
|
<% })}; %>
|
||||||
|
|
||||||
|
</table>
|
93
app/src/main/assets/feeds.html
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>
|
||||||
|
Feedmaster
|
||||||
|
</title>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="keywords" content="">
|
||||||
|
|
||||||
|
<link href="http://fonts.googleapis.com/css?family=Roboto+Slab:400,300,700" rel="stylesheet" type="text/css">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="css/normalize-min.css">
|
||||||
|
<link rel="stylesheet" href="css/skeleton.css">
|
||||||
|
<style>
|
||||||
|
.info {
|
||||||
|
border-bottom: 1px solid #bbbbbb;
|
||||||
|
padding-bottom:
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry {
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 300px;
|
||||||
|
}
|
||||||
|
.up, .ontime {
|
||||||
|
color: darkgreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
.down, .delayed {
|
||||||
|
color: darkred;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nochange {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="u-full-width content">
|
||||||
|
<table class="u-full-width">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Station</th>
|
||||||
|
<th>Time</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Paisley GS to Glasgow Central</td>
|
||||||
|
<td id='pygglc'>-- : --</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Glasgow Central to Partick</td>
|
||||||
|
<td id='glcptk'>-- : --</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Partick to Dumbarton Central</td>
|
||||||
|
<td id='ptkdbc'>-- : --</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Glasgow Queen St to Dumbarton Central</td>
|
||||||
|
<td id='glqdbc'>-- : --</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="trainResults" class="container">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <script type="text/javascript" src="js/zepto.js"></script>
|
||||||
|
<script type="text/javascript" src="js/moment.js"></script>
|
||||||
|
<script type="text/javascript" src="js/ejs.js"></script>-->
|
||||||
|
<script type="text/javascript" src="js/output.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/app.prod.js"></script>
|
||||||
|
<!--<script type="text/javascript" src="js/fx.js"></script>
|
||||||
|
<script type="text/javascript" src="js/fx_methods.js"></script>
|
||||||
|
<script type="text/javascript" src="js/zprogress.js"></script>
|
||||||
|
<script type="text/javascript" src="js/jquery.unveil.js"></script>-->
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
116
app/src/main/assets/js/app.prod.js
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
var APP;
|
||||||
|
APP = {
|
||||||
|
refreshStep: 0,
|
||||||
|
preUrl: '/',
|
||||||
|
|
||||||
|
_storage: {
|
||||||
|
lastupdated: null,
|
||||||
|
feeds: {}
|
||||||
|
},
|
||||||
|
|
||||||
|
lastUpdated: null,
|
||||||
|
preCache: function () {
|
||||||
|
this._trains = new EJS({
|
||||||
|
url: 'ejs/trains.ejs'
|
||||||
|
});
|
||||||
|
},
|
||||||
|
elmCache: {},
|
||||||
|
|
||||||
|
init: function () {
|
||||||
|
// console.log('app starting...');
|
||||||
|
this.preCache();
|
||||||
|
this.getUpdatedTimes();
|
||||||
|
},
|
||||||
|
getUpdatedTimes: function () {
|
||||||
|
this.getNextTrainTime('pyg', 'glc');
|
||||||
|
this.getNextTrainTime('glc', 'ptk');
|
||||||
|
this.getNextTrainTime('ptk', 'dbc');
|
||||||
|
this.getNextTrainTime('glq', 'dbc');
|
||||||
|
},
|
||||||
|
getNextTrainTime: function (from, to) {
|
||||||
|
var self, feedUrl, dest, jsonData;
|
||||||
|
self = this;
|
||||||
|
feedUrl = this.preUrl + 'getnexttraintimes?from=' + from + '&to=' + to;
|
||||||
|
dest = from + to;
|
||||||
|
|
||||||
|
jsonData = Android.getJson(feedUrl);
|
||||||
|
|
||||||
|
if (jsonData != '') {
|
||||||
|
self.updateTrain(dest, JSON.parse(jsonData));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
updateTrain: function (n, obj) {
|
||||||
|
var output, status;
|
||||||
|
|
||||||
|
if (this.elmCache[n] == null) {
|
||||||
|
this.elmCache[n] = $('#' + n);
|
||||||
|
}
|
||||||
|
|
||||||
|
output = (obj.eta.toLowerCase() === "on time") ? obj.sta : obj.eta;
|
||||||
|
status = (obj.eta.toLowerCase() !== "on time") ? 'delayed' : 'ontime';
|
||||||
|
|
||||||
|
this.elmCache[n].html(output);
|
||||||
|
this.elmCache[n].prop('class', status);
|
||||||
|
},
|
||||||
|
getTrains: function (from, to) {
|
||||||
|
var jsonData, self, url;
|
||||||
|
self = this;
|
||||||
|
url = '/gettrains?from=' + from + "&to=" + to;
|
||||||
|
jsonData = Android.getJson(url);
|
||||||
|
|
||||||
|
if (jsonData != '') {
|
||||||
|
self.getTrainsCB(self.fixProblems(jsonData));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fixProblems: function(data) {
|
||||||
|
var work = JSON.parse(data);
|
||||||
|
console.log();
|
||||||
|
for (var i = 0; i< work.trainServices.length;i++)
|
||||||
|
{
|
||||||
|
console.log(work.trainServices[i].sta);
|
||||||
|
if (work.trainServices[i].sta === null)
|
||||||
|
{
|
||||||
|
console.log('FIX');
|
||||||
|
// this train starts from this station.. so swap in other values
|
||||||
|
work.trainServices[i].sta = work.trainServices[i].std;
|
||||||
|
work.trainServices[i].eta = work.trainServices[i].etd;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (work.trainServices[i].platform === null) {
|
||||||
|
work.trainServices[i].platform = 'NA';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return work;
|
||||||
|
},
|
||||||
|
|
||||||
|
getTrainsCB: function (results) {
|
||||||
|
if (this.elmCache.dest$ == null) {
|
||||||
|
this.elmCache.dest$ = $('#trainResults');
|
||||||
|
}
|
||||||
|
|
||||||
|
var html = this._trains.render(results);
|
||||||
|
|
||||||
|
this.elmCache.dest$.empty();
|
||||||
|
this.elmCache.dest$.append(html);
|
||||||
|
|
||||||
|
},
|
||||||
|
setRoute: function(route) {
|
||||||
|
Android.setRoute(route);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function setRoute(route)
|
||||||
|
{
|
||||||
|
APP.setRoute(route);
|
||||||
|
}
|
||||||
|
|
||||||
|
Zepto(function ($) {
|
||||||
|
// console.log('Start app');
|
||||||
|
if (typeof(Storage) !== "undefined") {
|
||||||
|
APP.init();
|
||||||
|
} else {
|
||||||
|
// Sorry! No Web Storage support..
|
||||||
|
alert('No local storage');
|
||||||
|
}
|
||||||
|
});
|
123
app/src/main/assets/js/fx.js
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
// Zepto.js
|
||||||
|
// (c) 2010-2015 Thomas Fuchs
|
||||||
|
// Zepto.js may be freely distributed under the MIT license.
|
||||||
|
|
||||||
|
;(function($, undefined){
|
||||||
|
var prefix = '', eventPrefix,
|
||||||
|
vendors = { Webkit: 'webkit', Moz: '', O: 'o' },
|
||||||
|
testEl = document.createElement('div'),
|
||||||
|
supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i,
|
||||||
|
transform,
|
||||||
|
transitionProperty, transitionDuration, transitionTiming, transitionDelay,
|
||||||
|
animationName, animationDuration, animationTiming, animationDelay,
|
||||||
|
cssReset = {}
|
||||||
|
|
||||||
|
function dasherize(str) { return str.replace(/([a-z])([A-Z])/, '$1-$2').toLowerCase() }
|
||||||
|
function normalizeEvent(name) { return eventPrefix ? eventPrefix + name : name.toLowerCase() }
|
||||||
|
|
||||||
|
$.each(vendors, function(vendor, event){
|
||||||
|
if (testEl.style[vendor + 'TransitionProperty'] !== undefined) {
|
||||||
|
prefix = '-' + vendor.toLowerCase() + '-'
|
||||||
|
eventPrefix = event
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
transform = prefix + 'transform'
|
||||||
|
cssReset[transitionProperty = prefix + 'transition-property'] =
|
||||||
|
cssReset[transitionDuration = prefix + 'transition-duration'] =
|
||||||
|
cssReset[transitionDelay = prefix + 'transition-delay'] =
|
||||||
|
cssReset[transitionTiming = prefix + 'transition-timing-function'] =
|
||||||
|
cssReset[animationName = prefix + 'animation-name'] =
|
||||||
|
cssReset[animationDuration = prefix + 'animation-duration'] =
|
||||||
|
cssReset[animationDelay = prefix + 'animation-delay'] =
|
||||||
|
cssReset[animationTiming = prefix + 'animation-timing-function'] = ''
|
||||||
|
|
||||||
|
$.fx = {
|
||||||
|
off: (eventPrefix === undefined && testEl.style.transitionProperty === undefined),
|
||||||
|
speeds: { _default: 400, fast: 200, slow: 600 },
|
||||||
|
cssPrefix: prefix,
|
||||||
|
transitionEnd: normalizeEvent('TransitionEnd'),
|
||||||
|
animationEnd: normalizeEvent('AnimationEnd')
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.animate = function(properties, duration, ease, callback, delay){
|
||||||
|
if ($.isFunction(duration))
|
||||||
|
callback = duration, ease = undefined, duration = undefined
|
||||||
|
if ($.isFunction(ease))
|
||||||
|
callback = ease, ease = undefined
|
||||||
|
if ($.isPlainObject(duration))
|
||||||
|
ease = duration.easing, callback = duration.complete, delay = duration.delay, duration = duration.duration
|
||||||
|
if (duration) duration = (typeof duration == 'number' ? duration :
|
||||||
|
($.fx.speeds[duration] || $.fx.speeds._default)) / 1000
|
||||||
|
if (delay) delay = parseFloat(delay) / 1000
|
||||||
|
return this.anim(properties, duration, ease, callback, delay)
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.anim = function(properties, duration, ease, callback, delay){
|
||||||
|
var key, cssValues = {}, cssProperties, transforms = '',
|
||||||
|
that = this, wrappedCallback, endEvent = $.fx.transitionEnd,
|
||||||
|
fired = false
|
||||||
|
|
||||||
|
if (duration === undefined) duration = $.fx.speeds._default / 1000
|
||||||
|
if (delay === undefined) delay = 0
|
||||||
|
if ($.fx.off) duration = 0
|
||||||
|
|
||||||
|
if (typeof properties == 'string') {
|
||||||
|
// keyframe animation
|
||||||
|
cssValues[animationName] = properties
|
||||||
|
cssValues[animationDuration] = duration + 's'
|
||||||
|
cssValues[animationDelay] = delay + 's'
|
||||||
|
cssValues[animationTiming] = (ease || 'linear')
|
||||||
|
endEvent = $.fx.animationEnd
|
||||||
|
} else {
|
||||||
|
cssProperties = []
|
||||||
|
// CSS transitions
|
||||||
|
for (key in properties)
|
||||||
|
if (supportedTransforms.test(key)) transforms += key + '(' + properties[key] + ') '
|
||||||
|
else cssValues[key] = properties[key], cssProperties.push(dasherize(key))
|
||||||
|
|
||||||
|
if (transforms) cssValues[transform] = transforms, cssProperties.push(transform)
|
||||||
|
if (duration > 0 && typeof properties === 'object') {
|
||||||
|
cssValues[transitionProperty] = cssProperties.join(', ')
|
||||||
|
cssValues[transitionDuration] = duration + 's'
|
||||||
|
cssValues[transitionDelay] = delay + 's'
|
||||||
|
cssValues[transitionTiming] = (ease || 'linear')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wrappedCallback = function(event){
|
||||||
|
if (typeof event !== 'undefined') {
|
||||||
|
if (event.target !== event.currentTarget) return // makes sure the event didn't bubble from "below"
|
||||||
|
$(event.target).unbind(endEvent, wrappedCallback)
|
||||||
|
} else
|
||||||
|
$(this).unbind(endEvent, wrappedCallback) // triggered by setTimeout
|
||||||
|
|
||||||
|
fired = true
|
||||||
|
$(this).css(cssReset)
|
||||||
|
callback && callback.call(this)
|
||||||
|
}
|
||||||
|
if (duration > 0){
|
||||||
|
this.bind(endEvent, wrappedCallback)
|
||||||
|
// transitionEnd is not always firing on older Android phones
|
||||||
|
// so make sure it gets fired
|
||||||
|
setTimeout(function(){
|
||||||
|
if (fired) return
|
||||||
|
wrappedCallback.call(that)
|
||||||
|
}, ((duration + delay) * 1000) + 25)
|
||||||
|
}
|
||||||
|
|
||||||
|
// trigger page reflow so new elements can animate
|
||||||
|
this.size() && this.get(0).clientLeft
|
||||||
|
|
||||||
|
this.css(cssValues)
|
||||||
|
|
||||||
|
if (duration <= 0) setTimeout(function() {
|
||||||
|
that.each(function(){ wrappedCallback.call(this) })
|
||||||
|
}, 0)
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
testEl = null
|
||||||
|
})(Zepto)
|
71
app/src/main/assets/js/fx_methods.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
// Zepto.js
|
||||||
|
// (c) 2010-2015 Thomas Fuchs
|
||||||
|
// Zepto.js may be freely distributed under the MIT license.
|
||||||
|
|
||||||
|
;(function($, undefined){
|
||||||
|
var document = window.document, docElem = document.documentElement,
|
||||||
|
origShow = $.fn.show, origHide = $.fn.hide, origToggle = $.fn.toggle
|
||||||
|
|
||||||
|
function anim(el, speed, opacity, scale, callback) {
|
||||||
|
if (typeof speed == 'function' && !callback) callback = speed, speed = undefined
|
||||||
|
var props = { opacity: opacity }
|
||||||
|
if (scale) {
|
||||||
|
props.scale = scale
|
||||||
|
el.css($.fx.cssPrefix + 'transform-origin', '0 0')
|
||||||
|
}
|
||||||
|
return el.animate(props, speed, null, callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
function hide(el, speed, scale, callback) {
|
||||||
|
return anim(el, speed, 0, scale, function(){
|
||||||
|
origHide.call($(this))
|
||||||
|
callback && callback.call(this)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.show = function(speed, callback) {
|
||||||
|
origShow.call(this)
|
||||||
|
if (speed === undefined) speed = 0
|
||||||
|
else this.css('opacity', 0)
|
||||||
|
return anim(this, speed, 1, '1,1', callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.hide = function(speed, callback) {
|
||||||
|
if (speed === undefined) return origHide.call(this)
|
||||||
|
else return hide(this, speed, '0,0', callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.toggle = function(speed, callback) {
|
||||||
|
if (speed === undefined || typeof speed == 'boolean')
|
||||||
|
return origToggle.call(this, speed)
|
||||||
|
else return this.each(function(){
|
||||||
|
var el = $(this)
|
||||||
|
el[el.css('display') == 'none' ? 'show' : 'hide'](speed, callback)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.fadeTo = function(speed, opacity, callback) {
|
||||||
|
return anim(this, speed, opacity, null, callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.fadeIn = function(speed, callback) {
|
||||||
|
var target = this.css('opacity')
|
||||||
|
if (target > 0) this.css('opacity', 0)
|
||||||
|
else target = 1
|
||||||
|
return origShow.call(this).fadeTo(speed, target, callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.fadeOut = function(speed, callback) {
|
||||||
|
return hide(this, speed, null, callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
$.fn.fadeToggle = function(speed, callback) {
|
||||||
|
return this.each(function(){
|
||||||
|
var el = $(this)
|
||||||
|
el[
|
||||||
|
(el.css('opacity') == 0 || el.css('display') == 'none') ? 'fadeIn' : 'fadeOut'
|
||||||
|
](speed, callback)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
})(Zepto)
|
70
app/src/main/assets/js/jquery.unveil.js
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* jQuery Unveil
|
||||||
|
* A very lightweight jQuery plugin to lazy load images
|
||||||
|
* http://luis-almeida.github.com/unveil
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license.
|
||||||
|
* Copyright 2013 Luís Almeida
|
||||||
|
* https://github.com/luis-almeida
|
||||||
|
*/
|
||||||
|
|
||||||
|
;
|
||||||
|
(function($) {
|
||||||
|
|
||||||
|
var blackList = ['feeds.feedburner.com', '.feedsportal.co'];
|
||||||
|
$.fn.unveil = function(threshold, callback) {
|
||||||
|
|
||||||
|
var $w = $(window),
|
||||||
|
th = threshold || 0,
|
||||||
|
retina = window.devicePixelRatio > 1,
|
||||||
|
attrib = retina ? "data-src-retina" : "data-src",
|
||||||
|
images = this,
|
||||||
|
loaded;
|
||||||
|
|
||||||
|
this.one("unveil", function() {
|
||||||
|
var source = this.getAttribute(attrib);
|
||||||
|
source = source || this.getAttribute("data-src");
|
||||||
|
|
||||||
|
var flag = false;
|
||||||
|
for (var item in blackList) {
|
||||||
|
var u = blackList[item];
|
||||||
|
if (source.indexOf(u) !== -1) {
|
||||||
|
flag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (source && !flag) {
|
||||||
|
this.setAttribute("src", source);
|
||||||
|
if (typeof callback === "function") callback.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flag) {
|
||||||
|
this.setAttribute("style", 'display:none !important;');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function unveil() {
|
||||||
|
var inview = images.filter(function() {
|
||||||
|
var $e = $(this);
|
||||||
|
// if ($e.is(":hidden")) return;
|
||||||
|
|
||||||
|
var wt = $w.scrollTop(),
|
||||||
|
wb = wt + $w.height(),
|
||||||
|
et = $e.offset().top,
|
||||||
|
eb = et + $e.height();
|
||||||
|
|
||||||
|
return eb >= wt - th && et <= wb + th;
|
||||||
|
});
|
||||||
|
|
||||||
|
loaded = inview.trigger("unveil");
|
||||||
|
images = images.not(loaded);
|
||||||
|
}
|
||||||
|
|
||||||
|
$w.on("scroll.unveil resize.unveil lookup.unveil", unveil);
|
||||||
|
|
||||||
|
unveil();
|
||||||
|
|
||||||
|
return this;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
})(window.jQuery || window.Zepto);
|
3
app/src/main/assets/js/output.min.js
vendored
Normal file
58
app/src/main/assets/js/route.js
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
var ROUTE;
|
||||||
|
ROUTE = {
|
||||||
|
|
||||||
|
preUrl: '/',
|
||||||
|
|
||||||
|
lastUpdated: null,
|
||||||
|
preCache: function () {
|
||||||
|
this._routes = new EJS({
|
||||||
|
url: 'ejs/routes.ejs'
|
||||||
|
});
|
||||||
|
},
|
||||||
|
elmCache: {},
|
||||||
|
routeID:null,
|
||||||
|
|
||||||
|
init: function () {
|
||||||
|
console.log('INIT');
|
||||||
|
this.preCache();
|
||||||
|
// this.getUpdatedTimes();
|
||||||
|
},
|
||||||
|
getRoute: function (id) {
|
||||||
|
var self, feedUrl, dest, jsonData;
|
||||||
|
self = this;
|
||||||
|
feedUrl = this.preUrl + 'getroute?route=' + id;
|
||||||
|
|
||||||
|
console.log(feedUrl);
|
||||||
|
|
||||||
|
jsonData = Android.getJson(feedUrl);
|
||||||
|
|
||||||
|
if (jsonData != '') {
|
||||||
|
self.displayRoute(JSON.parse(jsonData));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
displayRoute(data) {
|
||||||
|
console.log(data);
|
||||||
|
if (this.elmCache.dest$ == null) {
|
||||||
|
this.elmCache.dest$ = $('#trainResults');
|
||||||
|
}
|
||||||
|
|
||||||
|
var html = this._routes.render(data);
|
||||||
|
|
||||||
|
this.elmCache.dest$.empty();
|
||||||
|
this.elmCache.dest$.append(html);
|
||||||
|
|
||||||
|
},
|
||||||
|
getRouteId: function() {
|
||||||
|
console.log('getRouteId');
|
||||||
|
routeID = Android.getRoute();
|
||||||
|
console.log(routeID);
|
||||||
|
this.displayRoute(JSON.parse(routeID));
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Zepto(function ($) {
|
||||||
|
ROUTE.init();
|
||||||
|
ROUTE.getRouteId();
|
||||||
|
});
|
74
app/src/main/assets/js/zprogress.js
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
// zprogress (c) 2013 Thomas Fuchs
|
||||||
|
// MIT-licensed - https://github.com/madrobby/zprogress
|
||||||
|
|
||||||
|
;(function($){
|
||||||
|
var html =
|
||||||
|
'<style>#zprogress{position:fixed;top:0;left:0;width:100%;height:3px;opacity:0;pointer-events:none;-webkit-pointer-events:none;z-index:1000}'+
|
||||||
|
'#zprogress_indicator{width:100%;margin-left:-100%;height:100%;background:#1c88ff}'+
|
||||||
|
'</style>'+
|
||||||
|
'<div id=zprogress><div id=zprogress_indicator></div></div>',
|
||||||
|
$wrapper, $indicator, value, timeout,
|
||||||
|
MARGIN = 12.5,
|
||||||
|
LMARGIN = MARGIN/100,
|
||||||
|
RMARGIN = 1 - LMARGIN
|
||||||
|
|
||||||
|
function init(){
|
||||||
|
if($wrapper) return
|
||||||
|
|
||||||
|
$('body').append(html)
|
||||||
|
$wrapper = $('#zprogress')
|
||||||
|
$indicator = $('#zprogress_indicator')
|
||||||
|
}
|
||||||
|
|
||||||
|
function anim(){
|
||||||
|
$indicator.animate({ translateX: value*100+'%' }, 200)
|
||||||
|
}
|
||||||
|
|
||||||
|
function clear(){
|
||||||
|
if(timeout) clearTimeout(timeout)
|
||||||
|
timeout = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
function trickle(){
|
||||||
|
timeout = setTimeout(function(){
|
||||||
|
$.zprogress.inc((RMARGIN-value)*.035*Math.random())
|
||||||
|
trickle()
|
||||||
|
}, 350+(400*Math.random()))
|
||||||
|
}
|
||||||
|
|
||||||
|
$.zprogress = {
|
||||||
|
start: function(){
|
||||||
|
init()
|
||||||
|
clear()
|
||||||
|
value = LMARGIN
|
||||||
|
$wrapper.animate({ opacity: 1 })
|
||||||
|
$indicator.animate({ translateX: '0%' }, 0)
|
||||||
|
setTimeout(function(){
|
||||||
|
anim()
|
||||||
|
trickle()
|
||||||
|
},0)
|
||||||
|
},
|
||||||
|
inc: function(delta){
|
||||||
|
if(value<RMARGIN) value+=delta||.05
|
||||||
|
anim()
|
||||||
|
},
|
||||||
|
set: function(newValue){
|
||||||
|
init()
|
||||||
|
clear()
|
||||||
|
value = newValue
|
||||||
|
anim()
|
||||||
|
trickle()
|
||||||
|
},
|
||||||
|
done: function(){
|
||||||
|
init()
|
||||||
|
clear()
|
||||||
|
value = 1
|
||||||
|
anim()
|
||||||
|
setTimeout(function(){$wrapper.animate({ opacity: 0 })}, 100)
|
||||||
|
},
|
||||||
|
color: function(color){
|
||||||
|
init()
|
||||||
|
$indicator.css({ backgroundColor: color })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})(Zepto)
|
55
app/src/main/assets/stops.html
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>
|
||||||
|
Feedmaster
|
||||||
|
</title>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="keywords" content="">
|
||||||
|
|
||||||
|
<link href="http://fonts.googleapis.com/css?family=Roboto+Slab:400,300,700" rel="stylesheet" type="text/css">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="css/normalize-min.css">
|
||||||
|
<link rel="stylesheet" href="css/skeleton.css">
|
||||||
|
<style>
|
||||||
|
.info {
|
||||||
|
border-bottom: 1px solid #bbbbbb;
|
||||||
|
padding-bottom:
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry {
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 300px;
|
||||||
|
}
|
||||||
|
.up, .ontime {
|
||||||
|
color: darkgreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
.down, .delayed {
|
||||||
|
color: darkred;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nochange {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="text/javascript" src="js/output.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/route.js"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h3>Details</h3>
|
||||||
|
|
||||||
|
<div id="trainResults" class="container">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
329
app/src/main/java/com/silvrtree/traintimes/MainActivity.java
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
package com.silvrtree.traintimes;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.app.FragmentTransaction;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.webkit.JavascriptInterface;
|
||||||
|
import android.webkit.WebSettings;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
|
||||||
|
public class MainActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
private static final String TAG = MainActivity.class.getSimpleName();
|
||||||
|
private WebView mWebView;
|
||||||
|
private StopsFragment stopsFragment;
|
||||||
|
private Menu storedMenu;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
|
||||||
|
mWebView = (WebView) findViewById(R.id.activity_main_webview);
|
||||||
|
|
||||||
|
WebSettings webSettings = mWebView.getSettings();
|
||||||
|
webSettings.setJavaScriptEnabled(true);
|
||||||
|
webSettings.setDomStorageEnabled(true);
|
||||||
|
webSettings.setAllowFileAccessFromFileURLs(true); //Maybe you don't need this rule
|
||||||
|
webSettings.setAllowUniversalAccessFromFileURLs(true);
|
||||||
|
|
||||||
|
|
||||||
|
mWebView.addJavascriptInterface(new JsObject(), "Android");
|
||||||
|
mWebView.loadUrl("file:///android_asset/feeds.html");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
// Inflate the menu; this adds items to the action bar if it is present.
|
||||||
|
getMenuInflater().inflate(R.menu.menu_main, menu);
|
||||||
|
storedMenu = menu;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showStopsMenu() {
|
||||||
|
MainActivity.this.runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
storedMenu.findItem(R.id.action_pygglc).setVisible(false);
|
||||||
|
storedMenu.findItem(R.id.action_glcptk).setVisible(false);
|
||||||
|
storedMenu.findItem(R.id.action_ptkdbc).setVisible(false);
|
||||||
|
storedMenu.findItem(R.id.action_glqdbc).setVisible(false);
|
||||||
|
storedMenu.findItem(R.id.action_refresh).setVisible(false);
|
||||||
|
storedMenu.findItem(R.id.action_refresh).setVisible(false);
|
||||||
|
storedMenu.findItem(R.id.action_return).setVisible(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showProperMenu() {
|
||||||
|
MainActivity.this.runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
storedMenu.findItem(R.id.action_pygglc).setVisible(true);
|
||||||
|
storedMenu.findItem(R.id.action_glcptk).setVisible(true);
|
||||||
|
storedMenu.findItem(R.id.action_ptkdbc).setVisible(true);
|
||||||
|
storedMenu.findItem(R.id.action_glqdbc).setVisible(true);
|
||||||
|
storedMenu.findItem(R.id.action_refresh).setVisible(true);
|
||||||
|
storedMenu.findItem(R.id.action_refresh).setVisible(true);
|
||||||
|
storedMenu.findItem(R.id.action_return).setVisible(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
// Handle action bar item clicks here. The action bar will
|
||||||
|
// automatically handle clicks on the Home/Up button, so long
|
||||||
|
// as you specify a parent activity in AndroidManifest.xml.
|
||||||
|
int id = item.getItemId();
|
||||||
|
|
||||||
|
//noinspection SimplifiableIfStatement
|
||||||
|
if (id == R.id.action_refresh) {
|
||||||
|
removeFragment();
|
||||||
|
doRefresh();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id == R.id.action_pygglc) {
|
||||||
|
//doGetPYGGLC();
|
||||||
|
removeFragment();
|
||||||
|
doGetTrains("pyg", "glc");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id == R.id.action_glcptk) {
|
||||||
|
removeFragment();
|
||||||
|
doGetTrains("glc","ptk");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id == R.id.action_ptkdbc) {
|
||||||
|
removeFragment();
|
||||||
|
doGetTrains("ptk","dbc");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id == R.id.action_glqdbc) {
|
||||||
|
removeFragment();
|
||||||
|
doGetTrains("glq","dbc");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id == R.id.action_test) {
|
||||||
|
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||||
|
ft.setCustomAnimations(R.anim.frag_in, R.anim.frag_out);
|
||||||
|
if (stopsFragment == null) {
|
||||||
|
stopsFragment = StopsFragment.newInstance("bobbbbbb");
|
||||||
|
ft.replace(R.id.fragment_placeholder, stopsFragment);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
stopsFragment.showStops();
|
||||||
|
ft.show(stopsFragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ft.commit();
|
||||||
|
showStopsMenu();
|
||||||
|
//showStops
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id == R.id.action_return) {
|
||||||
|
removeFragment();
|
||||||
|
showProperMenu();
|
||||||
|
|
||||||
|
}
|
||||||
|
// getTrains
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeFragment() {
|
||||||
|
if (stopsFragment != null && stopsFragment.isAdded()) {
|
||||||
|
Log.d(TAG, "Fragment exists");
|
||||||
|
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||||
|
ft.setCustomAnimations(R.anim.frag_in, R.anim.frag_out);
|
||||||
|
ft.hide(stopsFragment);
|
||||||
|
ft.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void doRefresh() {
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
|
||||||
|
// showProgress();
|
||||||
|
mWebView.evaluateJavascript("APP.getUpdatedTimes();", null);
|
||||||
|
} else {
|
||||||
|
mWebView.loadUrl("javascript:APP.getUpdatedTimes();");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doGetPYGGLC() {
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
|
||||||
|
// showProgress();
|
||||||
|
mWebView.evaluateJavascript("APP.getTrains('pyg','glc');", null);
|
||||||
|
} else {
|
||||||
|
mWebView.loadUrl("javascript:APP.getTrains('pyg','glc');");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doGetTrains(String From, String To) {
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
|
||||||
|
// showProgress();
|
||||||
|
mWebView.evaluateJavascript("APP.getTrains('" + From + "','" + To + "');", null);
|
||||||
|
} else {
|
||||||
|
mWebView.loadUrl("javascript:APP.getTrains('" + From + "','" + To + "');");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doShowRoute(String route) {
|
||||||
|
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||||
|
ft.setCustomAnimations(R.anim.frag_in, R.anim.frag_out);
|
||||||
|
if (stopsFragment == null) {
|
||||||
|
stopsFragment = StopsFragment.newInstance(route);
|
||||||
|
ft.replace(R.id.fragment_placeholder, stopsFragment);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
stopsFragment.showStops();
|
||||||
|
ft.show(stopsFragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
showStopsMenu();
|
||||||
|
ft.commit();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class JsObject {
|
||||||
|
Context mContext;
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public String toString() {
|
||||||
|
return "injectedObject";
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void showToast(String toast) {
|
||||||
|
Toast.makeText(getApplicationContext(), toast, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void showProgress() {
|
||||||
|
MainActivity.this.runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
FrameLayout fl = (FrameLayout) findViewById(R.id.ProgressLayout);
|
||||||
|
fl.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void hideProgress() {
|
||||||
|
MainActivity.this.runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
FrameLayout fl = (FrameLayout) findViewById(R.id.ProgressLayout);
|
||||||
|
fl.setVisibility(View.INVISIBLE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public String getJson(String feedName) {
|
||||||
|
|
||||||
|
String parsedString = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
URL url = new URL("https://www.silvrtree.co.uk" + feedName);
|
||||||
|
Log.d(TAG, url.getPath());
|
||||||
|
|
||||||
|
URLConnection conn = url.openConnection();
|
||||||
|
|
||||||
|
HttpURLConnection httpConn = (HttpURLConnection) conn;
|
||||||
|
httpConn.setAllowUserInteraction(false);
|
||||||
|
httpConn.setInstanceFollowRedirects(true);
|
||||||
|
httpConn.setRequestMethod("GET");
|
||||||
|
httpConn.connect();
|
||||||
|
|
||||||
|
InputStream is = httpConn.getInputStream();
|
||||||
|
parsedString = convertinputStreamToString(is);
|
||||||
|
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return parsedString;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public boolean isNetworkAvailable() {
|
||||||
|
ConnectivityManager connectivityManager
|
||||||
|
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
|
||||||
|
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
public void setRoute(String route) {
|
||||||
|
Log.d(TAG, "Setting route: " + route);
|
||||||
|
String feedUrl = "/getroute?route=" + route;
|
||||||
|
String routeData = getJson(feedUrl);
|
||||||
|
|
||||||
|
doShowRoute(routeData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void threadShowProgress() {
|
||||||
|
ProgressBar pb = (ProgressBar) findViewById(R.id.pbLoading);
|
||||||
|
pb.setVisibility(ProgressBar.VISIBLE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String convertinputStreamToString(InputStream ists)
|
||||||
|
throws IOException {
|
||||||
|
if (ists != null) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
String line;
|
||||||
|
|
||||||
|
try {
|
||||||
|
BufferedReader r1 = new BufferedReader(new InputStreamReader(
|
||||||
|
ists, "UTF-8"));
|
||||||
|
while ((line = r1.readLine()) != null) {
|
||||||
|
sb.append(line).append("\n");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
ists.close();
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
123
app/src/main/java/com/silvrtree/traintimes/StopsFragment.java
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
package com.silvrtree.traintimes;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by marti on 13/01/2016.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class StopsFragment extends Fragment {
|
||||||
|
private static final String TAG = StopsFragment.class.getSimpleName();
|
||||||
|
private View stopsView;
|
||||||
|
private String serviceID;
|
||||||
|
private String routeDataSource;
|
||||||
|
private JSONObject routeData;
|
||||||
|
|
||||||
|
public static StopsFragment newInstance(String data) {
|
||||||
|
Log.d(TAG, "newInstance");
|
||||||
|
StopsFragment stopsFragment = new StopsFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString("routeDataSource", data);
|
||||||
|
stopsFragment.setArguments(args);
|
||||||
|
return stopsFragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
// Get back arguments
|
||||||
|
Log.d(TAG, "onCreate");
|
||||||
|
routeDataSource = getArguments().getString("routeData", "");
|
||||||
|
Log.d(TAG, serviceID);
|
||||||
|
try {
|
||||||
|
routeData = new JSONObject(routeDataSource);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
// routeData = getJson(serviceID);
|
||||||
|
showStops();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
// Defines the xml file for the fragment
|
||||||
|
View view = inflater.inflate(R.layout.fragment_stops, container, false);
|
||||||
|
|
||||||
|
stopsView = view;
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
|
super.onActivityCreated(savedInstanceState);
|
||||||
|
|
||||||
|
Log.d(TAG, "onActivityCreated");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
Log.d(TAG, "onStart");
|
||||||
|
showStops(serviceID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
Log.d(TAG, "onResume");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showStops() {
|
||||||
|
// do something in fragment
|
||||||
|
Log.d(TAG, "showstops: " );
|
||||||
|
|
||||||
|
TextView stationName = stopsView.findItem(R.id.action_pygglc);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static String convertinputStreamToString(InputStream ists)
|
||||||
|
throws IOException {
|
||||||
|
if (ists != null) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
String line;
|
||||||
|
|
||||||
|
try {
|
||||||
|
BufferedReader r1 = new BufferedReader(new InputStreamReader(
|
||||||
|
ists, "UTF-8"));
|
||||||
|
while ((line = r1.readLine()) != null) {
|
||||||
|
sb.append(line).append("\n");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
ists.close();
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
8
app/src/main/res/anim/frag_in.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:interpolator/accelerate_cubic">
|
||||||
|
<translate
|
||||||
|
android:fromYDelta="100%"
|
||||||
|
android:toYDelta="0"
|
||||||
|
android:duration="300" />
|
||||||
|
|
||||||
|
</set>
|
8
app/src/main/res/anim/frag_out.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:interpolator/accelerate_cubic">
|
||||||
|
<translate
|
||||||
|
android:fromYDelta="0"
|
||||||
|
android:toYDelta="100%"
|
||||||
|
android:duration="300" />
|
||||||
|
|
||||||
|
</set>
|
25
app/src/main/res/drawable/ic_menu_refresh.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
Copyright (C) 2014 The Android Open Source Project
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:pathData="M17.6,6.4C16.2,4.9 14.2,4 12,4c-4.4,0 -8,3.6 -8,8s3.6,8 8,8c3.7,0 6.8,-2.6 7.7,-6l-2.1,0c-0.8,2.3 -3,4 -5.6,4c-3.3,0 -6,-2.7 -6,-6s2.7,-6 6,-6c1.7,0 3.1,0.7 4.2,1.8L13,11l7,0L20,4L17.6,6.4z"
|
||||||
|
android:fillColor="#ffffff"/>
|
||||||
|
</vector>
|
BIN
app/src/main/res/drawable/perm_group_sync_settings.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
55
app/src/main/res/layout/activity_main.xml
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<!--
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
tools:context="com.silvrtree.traintimes.MainActivity">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Hello World!" />
|
||||||
|
</RelativeLayout>
|
||||||
|
-->
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".MainActivity">
|
||||||
|
|
||||||
|
<WebView
|
||||||
|
android:id="@+id/activity_main_webview"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/ProgressLayout"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_horizontal|bottom"
|
||||||
|
android:layout_marginBottom="72dp"
|
||||||
|
android:visibility="invisible">
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/pbLoading"
|
||||||
|
android:visibility="visible"
|
||||||
|
android:layout_width="76dip"
|
||||||
|
android:layout_height="76dip"
|
||||||
|
android:gravity="center"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:indeterminate="true"
|
||||||
|
style="@android:style/Widget.DeviceDefault.ProgressBar.Large" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/fragment_placeholder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
</FrameLayout>
|
31
app/src/main/res/layout/fragment_stops.xml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical" android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:text="Medium Text"
|
||||||
|
android:id="@+id/stationName"
|
||||||
|
android:layout_gravity="center_horizontal" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:text="Medium Text"
|
||||||
|
android:id="@+id/textView2" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:text="Medium Text"
|
||||||
|
android:id="@+id/textView3" />
|
||||||
|
|
||||||
|
<TableLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"></TableLayout>
|
||||||
|
</LinearLayout>
|
28
app/src/main/res/menu/menu_main.xml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
|
||||||
|
<item android:id="@+id/action_pygglc" android:title="@string/pygglc"
|
||||||
|
android:orderInCategory="100" app:showAsAction="collapseActionView" />
|
||||||
|
<item android:id="@+id/action_glcptk" android:title="@string/glcptk"
|
||||||
|
android:orderInCategory="101" app:showAsAction="collapseActionView" />
|
||||||
|
<item android:id="@+id/action_ptkdbc" android:title="@string/ptkdbc"
|
||||||
|
android:orderInCategory="102" app:showAsAction="collapseActionView" />
|
||||||
|
<item android:id="@+id/action_glqdbc" android:title="@string/glqdbc"
|
||||||
|
android:orderInCategory="103" app:showAsAction="collapseActionView" />
|
||||||
|
|
||||||
|
<item android:id="@+id/action_refresh" android:title="@string/refreshTimes"
|
||||||
|
android:orderInCategory="99" app:showAsAction="always" android:icon="@drawable/ic_menu_refresh" />
|
||||||
|
|
||||||
|
|
||||||
|
<item android:id="@+id/action_test" android:title="TEST Fragment"
|
||||||
|
android:orderInCategory="998" app:showAsAction="collapseActionView" android:visible="false"/>
|
||||||
|
|
||||||
|
|
||||||
|
<item android:id="@+id/action_close" android:title="DESTROY Fragment"
|
||||||
|
android:orderInCategory="999" app:showAsAction="collapseActionView" android:visible="false" />
|
||||||
|
|
||||||
|
<item android:id="@+id/action_return" android:title="Back"
|
||||||
|
android:orderInCategory="800" app:showAsAction="always" android:visible="false"/>
|
||||||
|
|
||||||
|
|
||||||
|
</menu>
|
8
app/src/main/res/menu/menu_return.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
|
||||||
|
<item android:id="@+id/action_return" android:title="Back"
|
||||||
|
android:orderInCategory="100" app:showAsAction="collapseActionView" />
|
||||||
|
|
||||||
|
|
||||||
|
</menu>
|
BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
6
app/src/main/res/values-w820dp/dimens.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
|
||||||
|
(such as screen margins) for screens with more than 820dp of available width. This
|
||||||
|
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
|
||||||
|
<dimen name="activity_horizontal_margin">64dp</dimen>
|
||||||
|
</resources>
|
6
app/src/main/res/values/colors.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="colorPrimary">#3F51B5</color>
|
||||||
|
<color name="colorPrimaryDark">#303F9F</color>
|
||||||
|
<color name="colorAccent">#FF4081</color>
|
||||||
|
</resources>
|
5
app/src/main/res/values/dimens.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||||
|
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||||
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
</resources>
|
8
app/src/main/res/values/strings.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<resources>
|
||||||
|
<string name="app_name">TrainTimes</string>
|
||||||
|
<string name="pygglc">Paisley to Glasgow Central</string>
|
||||||
|
<string name="glcptk">Glasgow Central to Partick</string>
|
||||||
|
<string name="ptkdbc">Partick to Dumbarton Central</string>
|
||||||
|
<string name="glqdbc">Glasgow Queen Street to Dumbarton Central</string>
|
||||||
|
<string name="refreshTimes">Refresh Times</string>
|
||||||
|
</resources>
|
11
app/src/main/res/values/styles.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="colorPrimary">@color/colorPrimary</item>
|
||||||
|
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||||
|
<item name="colorAccent">@color/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.silvrtree.traintimes;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To work on unit tests, switch the Test Artifact in the Build Variants view.
|
||||||
|
*/
|
||||||
|
public class ExampleUnitTest {
|
||||||
|
@Test
|
||||||
|
public void addition_isCorrect() throws Exception {
|
||||||
|
assertEquals(4, 2 + 2);
|
||||||
|
}
|
||||||
|
}
|
23
build.gradle
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath 'com.android.tools.build:gradle:1.5.0'
|
||||||
|
|
||||||
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
// in the individual module build.gradle files
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
repositories {
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task clean(type: Delete) {
|
||||||
|
delete rootProject.buildDir
|
||||||
|
}
|
18
gradle.properties
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Project-wide Gradle settings.
|
||||||
|
|
||||||
|
# IDE (e.g. Android Studio) users:
|
||||||
|
# Gradle settings configured through the IDE *will override*
|
||||||
|
# any settings specified in this file.
|
||||||
|
|
||||||
|
# For more details on how to configure your build environment visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
|
|
||||||
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
|
# Default value: -Xmx10248m -XX:MaxPermSize=256m
|
||||||
|
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
|
||||||
|
|
||||||
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
|
# org.gradle.parallel=true
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#Wed Oct 21 11:34:03 PDT 2015
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
|
160
gradlew
vendored
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
##
|
||||||
|
## Gradle start up script for UN*X
|
||||||
|
##
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS=""
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD="maximum"
|
||||||
|
|
||||||
|
warn ( ) {
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die ( ) {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
case "`uname`" in
|
||||||
|
CYGWIN* )
|
||||||
|
cygwin=true
|
||||||
|
;;
|
||||||
|
Darwin* )
|
||||||
|
darwin=true
|
||||||
|
;;
|
||||||
|
MINGW* )
|
||||||
|
msys=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
PRG="$0"
|
||||||
|
# Need this for relative symlinks.
|
||||||
|
while [ -h "$PRG" ] ; do
|
||||||
|
ls=`ls -ld "$PRG"`
|
||||||
|
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||||
|
if expr "$link" : '/.*' > /dev/null; then
|
||||||
|
PRG="$link"
|
||||||
|
else
|
||||||
|
PRG=`dirname "$PRG"`"/$link"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
SAVED="`pwd`"
|
||||||
|
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||||
|
APP_HOME="`pwd -P`"
|
||||||
|
cd "$SAVED" >/dev/null
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="java"
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
||||||
|
MAX_FD_LIMIT=`ulimit -H -n`
|
||||||
|
if [ $? -eq 0 ] ; then
|
||||||
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||||
|
MAX_FD="$MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
ulimit -n $MAX_FD
|
||||||
|
if [ $? -ne 0 ] ; then
|
||||||
|
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Darwin, add options to specify how the application appears in the dock
|
||||||
|
if $darwin; then
|
||||||
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin ; then
|
||||||
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
|
|
||||||
|
# We build the pattern for arguments to be converted via cygpath
|
||||||
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||||
|
SEP=""
|
||||||
|
for dir in $ROOTDIRSRAW ; do
|
||||||
|
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||||
|
SEP="|"
|
||||||
|
done
|
||||||
|
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||||
|
# Add a user-defined pattern to the cygpath arguments
|
||||||
|
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||||
|
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||||
|
fi
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
i=0
|
||||||
|
for arg in "$@" ; do
|
||||||
|
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||||
|
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||||
|
|
||||||
|
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||||
|
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||||
|
else
|
||||||
|
eval `echo args$i`="\"$arg\""
|
||||||
|
fi
|
||||||
|
i=$((i+1))
|
||||||
|
done
|
||||||
|
case $i in
|
||||||
|
(0) set -- ;;
|
||||||
|
(1) set -- "$args0" ;;
|
||||||
|
(2) set -- "$args0" "$args1" ;;
|
||||||
|
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
|
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
|
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
|
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
|
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
|
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
|
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
||||||
|
function splitJvmOpts() {
|
||||||
|
JVM_OPTS=("$@")
|
||||||
|
}
|
||||||
|
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
||||||
|
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
||||||
|
|
||||||
|
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
90
gradlew.bat
vendored
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS=
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:init
|
||||||
|
@rem Get command-line arguments, handling Windowz variants
|
||||||
|
|
||||||
|
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||||
|
if "%@eval[2+2]" == "4" goto 4NT_args
|
||||||
|
|
||||||
|
:win9xME_args
|
||||||
|
@rem Slurp the command line arguments.
|
||||||
|
set CMD_LINE_ARGS=
|
||||||
|
set _SKIP=2
|
||||||
|
|
||||||
|
:win9xME_args_slurp
|
||||||
|
if "x%~1" == "x" goto execute
|
||||||
|
|
||||||
|
set CMD_LINE_ARGS=%*
|
||||||
|
goto execute
|
||||||
|
|
||||||
|
:4NT_args
|
||||||
|
@rem Get arguments from the 4NT Shell from JP Software
|
||||||
|
set CMD_LINE_ARGS=%$
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
1
settings.gradle
Normal file
@ -0,0 +1 @@
|
|||||||
|
include ':app'
|