├── settings.gradle
├── fastlane
└── metadata
│ └── android
│ └── en-US
│ ├── title.txt
│ ├── short_description.txt
│ ├── images
│ ├── icon.png
│ ├── featureGraphic.png
│ └── phoneScreenshots
│ │ ├── 1.jpg
│ │ ├── 2.jpg
│ │ ├── 3.jpg
│ │ ├── 4.jpg
│ │ ├── 5.jpg
│ │ ├── 6.jpg
│ │ ├── 7.jpg
│ │ ├── 8.jpg
│ │ └── 9.jpg
│ └── full_description.txt
├── gradle.properties
├── doc
├── action.png
├── lists.png
├── pick.png
├── today.png
├── pick-how.png
├── list-blog.png
├── pick-when.png
├── pick-other-filter.png
└── database.txt
├── app
├── src
│ └── main
│ │ ├── res
│ │ ├── xml
│ │ │ └── backuppaths.xml
│ │ ├── drawable-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── btn_check_buttonless_off.png
│ │ │ └── btn_check_buttonless_on.png
│ │ ├── drawable-ldpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── btn_check_buttonless_off.png
│ │ │ └── btn_check_buttonless_on.png
│ │ ├── drawable-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── btn_check_buttonless_off.png
│ │ │ └── btn_check_buttonless_on.png
│ │ ├── drawable-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── btn_check_buttonless_on.png
│ │ │ └── btn_check_buttonless_off.png
│ │ ├── menu
│ │ │ ├── activity_lists.xml
│ │ │ ├── locations.xml
│ │ │ ├── pick.xml
│ │ │ ├── lists_context_menu.xml
│ │ │ ├── locations_context.xml
│ │ │ ├── repeat.xml
│ │ │ ├── when.xml
│ │ │ ├── edit_list.xml
│ │ │ ├── edit_action.xml
│ │ │ ├── lists.xml
│ │ │ ├── main.xml
│ │ │ ├── actions_context_menu.xml
│ │ │ └── actions.xml
│ │ ├── layout
│ │ │ ├── activity_list_fragment.xml
│ │ │ ├── main.xml
│ │ │ ├── lists_layout.xml
│ │ │ ├── when_layout.xml
│ │ │ ├── action_layout.xml
│ │ │ ├── edit_list.xml
│ │ │ ├── actions_layout.xml
│ │ │ ├── activity_lists.xml
│ │ │ ├── repeat_layout.xml
│ │ │ ├── lists_fragment.xml
│ │ │ ├── actions_list_fragment.xml
│ │ │ ├── default_list_fragment.xml
│ │ │ ├── today_list_fragment.xml
│ │ │ ├── actions_fragment.xml
│ │ │ ├── edit_list_fragment.xml
│ │ │ ├── when_fragment.xml
│ │ │ ├── action_item.xml
│ │ │ ├── pick_actions.xml
│ │ │ ├── repeat_fragment.xml
│ │ │ └── edit_action_fragment.xml
│ │ ├── values-v11
│ │ │ └── styles.xml
│ │ ├── values-v14
│ │ │ └── styles.xml
│ │ └── values
│ │ │ ├── styles.xml
│ │ │ └── strings.xml
│ │ ├── java
│ │ └── eu
│ │ │ └── lastviking
│ │ │ └── app
│ │ │ └── vgtd
│ │ │ ├── Import.java
│ │ │ ├── Action.java
│ │ │ ├── Actions.java
│ │ │ ├── EditList.java
│ │ │ ├── VikingBackHandlerActivity.java
│ │ │ ├── WhenActivity.java
│ │ │ ├── RepeatActivity.java
│ │ │ ├── LastVikingGTD.java
│ │ │ ├── TodayFragment.java
│ │ │ ├── CategoryFilter.java
│ │ │ ├── VikingDropdownCtl.java
│ │ │ ├── MultiSpinner.java
│ │ │ ├── EditListFragment.java
│ │ │ ├── ImportFromTaskList.java
│ │ │ ├── DbAdapter.java
│ │ │ ├── LocationsActivity.java
│ │ │ ├── RepeatData.java
│ │ │ ├── When.java
│ │ │ ├── ListsFragment.java
│ │ │ ├── RepeatFragment.java
│ │ │ ├── WhenFragment.java
│ │ │ ├── MainView.java
│ │ │ ├── EditActionFragment.java
│ │ │ └── PickFragment.java
│ │ ├── assets
│ │ ├── vGTD_upgrade_1.sql
│ │ └── vGTD.sql
│ │ └── AndroidManifest.xml
├── build.gradle
└── AndroidManifest.xml
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── scripts
└── validate-fastlane.sh
├── AUTHORS.txt
├── .gitignore
├── README.md
├── gradlew.bat
└── gradlew
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | VikingGTD
2 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | android.enableJetifier=true
2 | android.useAndroidX=true
--------------------------------------------------------------------------------
/doc/action.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/doc/action.png
--------------------------------------------------------------------------------
/doc/lists.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/doc/lists.png
--------------------------------------------------------------------------------
/doc/pick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/doc/pick.png
--------------------------------------------------------------------------------
/doc/today.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/doc/today.png
--------------------------------------------------------------------------------
/doc/pick-how.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/doc/pick-how.png
--------------------------------------------------------------------------------
/doc/list-blog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/doc/list-blog.png
--------------------------------------------------------------------------------
/doc/pick-when.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/doc/pick-when.png
--------------------------------------------------------------------------------
/doc/pick-other-filter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/doc/pick-other-filter.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | "Getting Things Done" tasklist/activity manager
2 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/backuppaths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-ldpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-ldpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/btn_check_buttonless_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-hdpi/btn_check_buttonless_off.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/btn_check_buttonless_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-hdpi/btn_check_buttonless_on.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-ldpi/btn_check_buttonless_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-ldpi/btn_check_buttonless_off.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-ldpi/btn_check_buttonless_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-ldpi/btn_check_buttonless_on.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/btn_check_buttonless_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-mdpi/btn_check_buttonless_off.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/btn_check_buttonless_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-mdpi/btn_check_buttonless_on.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/btn_check_buttonless_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-xhdpi/btn_check_buttonless_on.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/featureGraphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/featureGraphic.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/btn_check_buttonless_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/app/src/main/res/drawable-xhdpi/btn_check_buttonless_off.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/7.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/8.jpg
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jgaa/VikingGTD/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/9.jpg
--------------------------------------------------------------------------------
/scripts/validate-fastlane.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | docker run --rm --workdir /app --mount type=bind,source="$(pwd)",target=/app ashutoshgngwr/validate-fastlane-supply-metadata:v1
3 |
--------------------------------------------------------------------------------
/AUTHORS.txt:
--------------------------------------------------------------------------------
1 | This project is hosted at: https://github.com/jgaa/VikingGTD
2 | Copyright 2013 - 2017 by Jarle Aase. All rights reserved.
3 |
4 | VikingGTD is written and maintained by "Jarle (jgaa) Aase"
5 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/Import.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import android.content.Context;
4 |
5 | public interface Import {
6 |
7 | public String GetName();
8 | public void Import();
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/assets/vGTD_upgrade_1.sql:
--------------------------------------------------------------------------------
1 | ALTER TABLE actions ADD COLUMN "repeat_type" INTEGER NOT NULL DEFAULT(0);
2 | ALTER TABLE actions ADD COLUMN "repeat_unit" INTEGER NOT NULL DEFAULT(0);
3 | ALTER TABLE actions ADD COLUMN "repeat_after" INTEGER NOT NULL DEFAULT(0);
4 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/activity_lists.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_list_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/locations.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Oct 26 17:53:47 EET 2020
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip
7 | distributionSha256Sum=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
8 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/pick.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v11/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v14/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/Action.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import eu.lastviking.app.vgtd.R;
4 | import android.os.Bundle;
5 |
6 | public class Action extends VikingBackHandlerActivity {
7 |
8 |
9 | @Override
10 | protected void onCreate(Bundle savedInstanceState) {
11 | super.onCreate(savedInstanceState);
12 |
13 | setContentView(R.layout.action_layout);
14 | this.setTitle(R.string.action);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/lists_context_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/locations_context.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/lists_layout.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/when_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/action_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/edit_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/actions_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_lists.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/repeat.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/when.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/repeat_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/edit_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/edit_action.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/lists.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/Actions.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import eu.lastviking.app.vgtd.R;
4 | import android.app.Activity;
5 | import android.os.Bundle;
6 | import android.util.Log;
7 |
8 | public class Actions extends Activity {
9 |
10 | private final String TAG = "Actions";
11 |
12 | @Override
13 | protected void onCreate(Bundle savedInstanceState) {
14 | super.onCreate(savedInstanceState);
15 | setContentView(R.layout.actions_layout);
16 |
17 | this.setTitle(R.string.actions);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/EditList.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import eu.lastviking.app.vgtd.R;
4 | import android.os.Bundle;
5 | import android.util.Log;
6 |
7 | public class EditList extends VikingBackHandlerActivity
8 | {
9 | static public final String TAG = "EditList";
10 |
11 | @Override
12 | protected void onCreate(Bundle savedInstanceState) {
13 | super.onCreate(savedInstanceState);
14 | try {
15 | setContentView(R.layout.edit_list);
16 | } catch(Exception ex) {
17 | Log.e(TAG, "Caught exception when inflating: " + ex.toString());
18 | }
19 | }
20 | }
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/lists_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
13 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | #built application files
2 | *.apk
3 | *.ap_
4 | *.aab
5 | app/release/
6 |
7 | # files for the dex VM
8 | *.dex
9 |
10 | # Java class files
11 | *.class
12 |
13 | # generated files
14 | bin/
15 | gen/
16 |
17 | # Local configuration file (sdk path, etc)
18 | local.properties
19 |
20 | # Windows thumbnail db
21 | Thumbs.db
22 |
23 | # OSX files
24 | .DS_Store
25 |
26 | # Android Studio
27 | *.iml
28 | .idea
29 | #.idea/workspace.xml - remove # and delete .idea if it better suit your needs.
30 | .gradle
31 | build/
32 | .navigation
33 | captures/
34 | output.json #Since Android Studio 3.0
35 |
36 | #NDK
37 | obj/
38 | .externalNativeBuild
39 |
40 | # Others
41 | import-summary.txt
42 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/actions_list_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
13 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/default_list_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
13 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/today_list_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
13 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/actions_context_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
14 |
15 |
16 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/VikingBackHandlerActivity.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 | import android.app.Activity;
3 | import android.util.Log;
4 |
5 |
6 | public class VikingBackHandlerActivity extends Activity {
7 |
8 | private static final String TAG = "VikingBackHandlerActivity";
9 | private Handler handler_;
10 |
11 | public interface Handler {
12 | boolean OnBackButtonPressed();
13 | }
14 |
15 | public void SetBackHandler(Handler handler) {
16 | handler_ = handler;
17 | }
18 |
19 | @Override
20 | public void onBackPressed() {
21 | if ((null != handler_) && !handler_.OnBackButtonPressed()) {
22 | Log.d(TAG, "Back button ignored");
23 |
24 | } else {
25 | Log.d(TAG, "Back button OK");
26 | super.onBackPressed();
27 | }
28 | }
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/actions_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
15 |
16 |
21 |
22 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 30
5 | buildToolsVersion "29.0.2"
6 |
7 | defaultConfig {
8 | applicationId "eu.lastviking.app.vgtd"
9 | minSdkVersion 14
10 | targetSdkVersion 30
11 | }
12 |
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
17 | }
18 | }
19 | }
20 |
21 | dependencies {
22 | implementation 'androidx.legacy:legacy-support-v4:1.0.0'
23 | implementation 'androidx.appcompat:appcompat:1.1.0'
24 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
25 | def core_version = "1.3.2"
26 |
27 | // Java language implementation
28 | implementation "androidx.core:core:$core_version"
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/WhenActivity.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import eu.lastviking.app.vgtd.R;
4 | import android.app.Activity;
5 | import android.app.Fragment;
6 | import android.os.Bundle;
7 |
8 | public class WhenActivity extends Activity {
9 |
10 | @Override
11 | protected void onCreate(Bundle savedInstanceState) {
12 | super.onCreate(savedInstanceState);
13 |
14 | setContentView(R.layout.when_layout);
15 | this.setTitle(R.string.when);
16 | }
17 |
18 | @Override
19 | public void onBackPressed() {
20 | SaveResult();
21 | super.onBackPressed();
22 | }
23 |
24 | @Override
25 | protected void onPause() {
26 | //SaveResult();
27 | super.onPause();
28 | }
29 |
30 | void SaveResult() {
31 | Fragment f = getFragmentManager().findFragmentById(R.id.when_fragment_node);
32 | if (null != f) {
33 | WhenFragment w = (WhenFragment)f;
34 | w.SaveResult();
35 | }
36 | }
37 |
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/doc/database.txt:
--------------------------------------------------------------------------------
1 |
2 | actions.repeat_type
3 | To save space, we use the first 8 bits for mode, and
4 | then the remaning bits for modifiers
5 | Mode:
6 | 0x000 = no repeat
7 | 0x001 = repeat after # units after completed
8 | 0x002 = repeat after # units after the scheduled date
9 | When:
10 | [default] repeat at next # unit after complete
11 | 0x100 = repeat at next # unit after scheduled
12 |
13 | actions.repeat_unit
14 | 0 = days
15 | 1 = weeks
16 | 2 = months
17 | 3 = years
18 |
19 | actions.repeat_after
20 | If actions.repeat_type 'when' is 0: unit's after scheduled/completed date
21 | If actions.repeat_type 'when' is 0x100:
22 | (unit_type is disabled/ignored)
23 | Day of week (bits - allow multiple selections)
24 | 0 - 6 day of week (monday - sunday).
25 | 10 = first day of week
26 | 11 = last day of week
27 | 12 = first day of month
28 | 13 = last day of month
29 | 14 = first day of year
30 | 15 = last day of year
31 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/RepeatActivity.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import android.app.Activity;
4 | import android.app.Fragment;
5 | import android.os.Bundle;
6 |
7 | /**
8 | * Created by jgaa on 4/14/14.
9 | */
10 | public class RepeatActivity extends Activity {
11 |
12 |
13 | @Override
14 | protected void onCreate(Bundle savedInstanceState) {
15 | super.onCreate(savedInstanceState);
16 |
17 | setContentView(R.layout.repeat_layout);
18 | this.setTitle(R.string.repeat);
19 | }
20 |
21 | @Override
22 | public void onBackPressed() {
23 | SaveResult();
24 | super.onBackPressed();
25 | }
26 |
27 | @Override
28 | protected void onPause() {
29 | //SaveResult();
30 | super.onPause();
31 | }
32 |
33 | void SaveResult() {
34 | Fragment f = getFragmentManager().findFragmentById(R.id.repeat_fragment_node);
35 | if (null != f) {
36 | RepeatFragment r = (RepeatFragment)f;
37 | r.SaveResult();
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/LastVikingGTD.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import java.io.IOException;
4 | import java.io.InputStream;
5 |
6 | import android.app.Application;
7 | import android.util.Log;
8 | import android.widget.Toast;
9 |
10 | public class LastVikingGTD extends Application {
11 |
12 | private static LastVikingGTD self_;
13 | public static final String LOG_TAG = "vGTD";
14 |
15 | public static LastVikingGTD GetInstance() {
16 | return self_;
17 | }
18 |
19 | @Override
20 | public void onCreate() {
21 | super.onCreate();
22 | self_ = this;
23 |
24 |
25 | }
26 |
27 | @Override
28 | public void onTerminate() {
29 | super.onTerminate();
30 | }
31 |
32 | public void TerminateWithError(final String message) {
33 | Toast.makeText(this, message, Toast.LENGTH_LONG).show();
34 | Log.e("Application ABORT", message);
35 | //System.exit(-1);
36 | }
37 |
38 | public String ReadAssetFile(final String path) throws IOException
39 | {
40 | Log.d(LOG_TAG, "Reading asset file '" + path + "'");
41 | InputStream stream = getAssets().open(path);
42 | int size = stream.available();
43 | byte[] buffer = new byte[size];
44 | stream.read(buffer);
45 | stream.close();
46 | return new String(buffer);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/actions.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/edit_list_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
19 |
20 |
21 |
22 |
23 |
29 |
30 |
37 |
38 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Getting Things Done tasklist/activity manager for Android
2 |
3 | This application implements what I believe is the most essential part of David Allens [Getting Things done](http://gettingthingsdone.com/) system: To be able to put all the *stuff* in your life into a system (lists) you can trust 100%.
4 |
5 | It's not a full blown GTD application - a lot of people (me included) are not ready to jump into that in one step. This application is for people who has grown out of the simple "to do apps" and "task managers" and need something a little better.
6 |
7 | Unlike most contemporary *"apps"*, it's free and safe. There are no ads. No tracking. No "phone home". I respect your privacy and integrity, and I trust that you will write me a mail if you have some things you want to share with me.
8 |
9 | # Background.
10 |
11 | I wrote this app back in 2013 to get an idea on how to write apps for Android. -- And to get a light-weight GTD app for my own use. I have used it ever since. It's sqlite database on my device is getting larger every day - but the application still runs quickly and responsive on all devices I have tested it.
12 |
13 | # Status
14 | The app is now updated to Android Studio 4, so it should be easy to look closer at for any Android Developers.
15 |
16 | I am planning a full-blown GTD app (for desktop and mobile) with some friends. So this app is in maintainance mode.
17 |
18 | There are some screenshots in the [doc](doc/) folder to give you an idea about what this app does.
19 |
20 | The app can be downloaded from the release menu above, or from [Google Play](https://play.google.com/store/apps/details?id=eu.lastviking.app.vgtd).
21 |
22 | Have fun!
23 |
--------------------------------------------------------------------------------
/app/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
12 |
13 |
14 |
21 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
14 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
33 |
38 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/when_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
20 |
21 |
25 |
26 |
30 |
31 |
35 |
36 |
41 |
42 |
48 |
49 |
54 |
55 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/action_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
15 |
16 |
30 |
31 |
41 |
42 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | Inspired by the great book Getting Things Done by David Allan. This is a program I wrote because I badly needed it in order to organize my own time. I failed to find anything, on any platform, that satisfied my requirements:
2 |
3 | * Free
4 | * Preferably Open Source
5 | * Designed after the principles in "Getting Things Done"
6 | * Safe; no unnecessary app privileges, no enforced integration with Google (or any other) services in order to work.
7 | * Fast and efficient to work with
8 | * Safeguards against losing data by accidents in stressful environments (for example by cancelling a half edited task by hitting the Android back button).
9 |
10 | These requirements became my blueprint when I built VikingGTD. VikingGTD is free of eye candy and animations – but in stead very fast and responsive, also when the number of tasks grows during real use by busy people. (The database on my device has more than 8000 actions).
11 |
12 | VikingGTD implements what I believe is the most essential part of David Allens Getting Things done system: To be able to put all the stuff in your life into a system (lists) you can trust 100%.
13 |
14 | It's not a full blown GTD application - a lot of people (me included) are not ready to jump into that in one step. This application is for people who has grown out of the simple "to do apps" and "task managers" and need something a little better.
15 |
16 |
17 | Features:
18 |
19 | * Any number of actions in one of any number of lists.
20 | * Each action can be configured with when, where, how and at what priority. These parameters can then be used to easily sort trough and re-organize the actions.
21 | * Search in lists and actions.
22 | * Fast access to main functions and frequently used features
23 | * Easy to schedule an action to any time, date, week, month, or year.
24 | * Easy and fast to reschedule one or more actions.
25 | * Export to / import from xml on the sdcard for backup and move to other devices. (I use Nextcloud for backing up my app data).
26 | * Flexible automatic repeat of completed actions for reoccurring tasks (from "Feed the cat" the next day to "years into the future).
27 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/TodayFragment.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import java.util.Calendar;
4 | import java.util.GregorianCalendar;
5 |
6 | import android.content.res.Resources;
7 | import android.os.Bundle;
8 | import android.util.Log;
9 | import android.view.LayoutInflater;
10 | import android.view.Menu;
11 | import android.view.MenuItem;
12 | import android.view.View;
13 | import android.view.ViewGroup;
14 |
15 | public class TodayFragment extends ActionsListFragment {
16 | private final static String TAG = "TodayFragment";
17 |
18 | @Override
19 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
20 | Bundle savedInstanceState) {
21 | return inflater.inflate(R.layout.today_list_fragment, container, false);
22 | }
23 |
24 | @Override
25 | public String GetBaseFilterForDbQuery() {
26 | StringBuilder filter = new StringBuilder();
27 | filter.append("(" + GtdContentProvider.ActionsDef.DUE_TYPE + " >= " + When.DueTypes.DATE.ordinal());
28 |
29 | Calendar from = Calendar.getInstance();
30 | from.set(Calendar.HOUR_OF_DAY, 0);
31 | from.set(Calendar.MINUTE, 0);
32 | from.set(Calendar.SECOND, 0);
33 |
34 | filter.append(" AND " + GtdContentProvider.ActionsDef.DUE_BY_TIME + " >= " + (from.getTimeInMillis() / 1000));
35 |
36 | Calendar to = new GregorianCalendar();
37 | to.setTime(from.getTime());
38 | to.add(Calendar.DAY_OF_YEAR, 1);
39 |
40 | filter.append(" AND " + GtdContentProvider.ActionsDef.DUE_BY_TIME + " < " + (to.getTimeInMillis() / 1000) + ")");
41 |
42 | Log.d(TAG, "Filter: " + filter.toString());
43 | return filter.toString();
44 | }
45 |
46 |
47 | @Override
48 | protected void SelectMenusToShow(Menu menu) {
49 | // Remove add, as we don't have any active list
50 | MenuItem add = menu.findItem(R.id.add_action);
51 | if (null != add) {
52 | add.setVisible(false);
53 | }
54 | }
55 |
56 | @Override
57 | boolean IsListTodayOnly() {
58 | return true;
59 | }
60 |
61 | @Override
62 | String GetEmptyListText() {
63 | Resources r = getResources();
64 | if (null != r) {
65 | return getResources().getString(R.string.no_actions_today);
66 | }
67 | return "";
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/pick_actions.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
17 |
18 |
22 |
23 |
27 |
28 |
32 |
33 |
37 |
38 |
42 |
43 |
44 |
45 |
51 |
52 |
56 |
57 |
58 |
62 |
63 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/CategoryFilter.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import java.util.ArrayList;
4 | import java.util.Collection;
5 | import java.util.HashMap;
6 | import java.util.Map;
7 |
8 | import android.os.Bundle;
9 |
10 | public class CategoryFilter {
11 |
12 | static final String PROP_LIST_CAT_KEY = "SelectedListCategories";
13 |
14 | public static class Data
15 | {
16 | final Integer id_;
17 | final String name_;
18 | Boolean selected_;
19 |
20 | Data(final Integer id, final String name)
21 | {
22 | id_ = id;
23 | name_ = name;
24 | selected_ = true;
25 | }
26 | }
27 |
28 | private Map f_;
29 |
30 | CategoryFilter()
31 | {
32 | // TODO: Fetch from content provider
33 | f_ = new HashMap();
34 | //for(Data d : LastVikingGTD.GetInstance().GetDb().GetListCategories()) {
35 | // f_.put(d.id_, d);
36 | //}
37 | Data d1 = new Data(1, "Work"), d2 = new Data(2, "Private");
38 | f_.put(d1.id_, d1);
39 | f_.put(d2.id_, d2);
40 | }
41 |
42 | void SetSelected(final Integer id, final Boolean enable) {
43 | Data d = f_.get(id);
44 | if (null != d) {
45 | d.selected_ = enable;
46 | }
47 | }
48 |
49 | Boolean IsSelected(final Integer id) {
50 | Data d = f_.get(id);
51 | if (null != d) {
52 | return d.selected_;
53 | }
54 | return false;
55 | }
56 |
57 | void SelectAll(final Boolean selected) {
58 | for(Data d : f_.values()) {
59 | d.selected_ = selected;
60 | }
61 | }
62 |
63 | final Collection GetAll() {
64 | return f_.values();
65 | }
66 |
67 | // Get a comma separated list of selected id's for use in SQL where clause
68 | public String GetDbFilter() {
69 | StringBuilder s = new StringBuilder();
70 | Boolean virgin = true;
71 |
72 | for(Data d : f_.values()) {
73 | if (d.selected_) {
74 | if (virgin)
75 | virgin = false;
76 | else
77 | s.append(",");
78 | s.append(d.id_.toString());
79 | }
80 | }
81 |
82 | return s.toString();
83 | }
84 |
85 | public void Save(Bundle sis) {
86 | ArrayList all_selected = new ArrayList();
87 |
88 | for(Data d : f_.values()) {
89 | if (d.selected_)
90 | all_selected.add(d.id_);
91 | }
92 |
93 | sis.putIntegerArrayList(PROP_LIST_CAT_KEY, all_selected);
94 | }
95 |
96 | public void Restore(Bundle sis) {
97 | ArrayList all_selected = sis.getIntegerArrayList(PROP_LIST_CAT_KEY);
98 | if ((null != all_selected) && (all_selected.size() > 0)) {
99 | SelectAll(false);
100 | for(Integer id : all_selected) {
101 | SetSelected(id, true);
102 | }
103 | } else {
104 | SelectAll(true);
105 | }
106 | }
107 |
108 | // Set all to selected if all is unselected.
109 | // Return true if we changed something.
110 | public Boolean SanetyCheck() {
111 | Boolean do_reset = true;
112 |
113 | for(Data d : f_.values()) {
114 | if (d.selected_) {
115 | do_reset = false;
116 | break;
117 | }
118 | }
119 |
120 | if (do_reset) {
121 | SelectAll(true);
122 | }
123 |
124 | return do_reset;
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/app/src/main/assets/vGTD.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "list_categories" (
2 | "_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
3 | "name" TEXT NOT NULL
4 | );
5 | INSERT INTO "list_categories" VALUES(1,'Work');
6 | INSERT INTO "list_categories" VALUES(2,'Private');
7 | CREATE TABLE lists (
8 | "_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
9 | "name" TEXT NOT NULL,
10 | "descr" TEXT,
11 | "category" TEXT NOT NULL DEFAULT (0),
12 | "color" INTEGER NOT NULL DEFAULT (16777215),
13 | FOREIGN KEY(category) REFERENCES list_categories(_id) ON DELETE CASCADE
14 | );
15 | CREATE TABLE "actions" (
16 | "_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
17 | "list_id" INTEGER NOT NULL,
18 | "priority" INTEGER NOT NULL DEFAULT (5),
19 | "name" TEXT NOT NULL,
20 | "descr" TEXT,
21 | "created_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
22 | "due_type" INTEGER NOT NULL DEFAULT (0),
23 | "due_by_time" TIMESTAMP,
24 | "completed_time" TIMESTAMP NOT NULL DEFAULT(0),
25 | "completed" INTEGER NOT NULL DEFAULT (0),
26 | "time_estimate" INTEGER,
27 | "focus_needed" INTEGER NOT NULL DEFAULT (3),
28 | "related_to" TEXT,
29 | "repeat_type" INTEGER NOT NULL DEFAULT(0),
30 | "repeat_unit" INTEGER NOT NULL DEFAULT(0),
31 | "repeat_after" INTEGER NOT NULL DEFAULT(0),
32 | FOREIGN KEY(list_id) REFERENCES lists(_id) ON DELETE CASCADE
33 | );
34 | CREATE TABLE "todos" (
35 | "_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
36 | "action_id" INTEGER NOT NULL,
37 | "priority" INTEGER NOT NULL DEFAULT (5),
38 | "show_after" INTEGER NOT NULL DEFAULT (0),
39 | "done" INTEGER NOT NULL DEFAULT (0),
40 | "name" TEXT NOT NULL,
41 | "description" TEXT,
42 | FOREIGN KEY(action_id) REFERENCES actions(_id) ON DELETE CASCADE
43 | );
44 | CREATE TABLE "locations" (
45 | "_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
46 | "name" TEXT NOT NULL
47 | );
48 | INSERT INTO "locations" VALUES(1,'At the Office');
49 | INSERT INTO "locations" VALUES(2,'Home');
50 | INSERT INTO "locations" VALUES(3,'In the Car');
51 | INSERT INTO "locations" VALUES(4,'At the Airport');
52 | INSERT INTO "locations" VALUES(5,'Long distance flight');
53 | CREATE TABLE "action2location" (
54 | "action_id" INTEGER NOT NULL,
55 | "location_id" INTEGER NOT NULL,
56 | FOREIGN KEY(action_id) REFERENCES actions(_id) ON DELETE CASCADE,
57 | FOREIGN KEY(location_id) REFERENCES locations(_id) ON DELETE CASCADE
58 | );
59 | DELETE FROM sqlite_sequence;
60 | INSERT INTO "sqlite_sequence" VALUES('list_categories',3);
61 | INSERT INTO "sqlite_sequence" VALUES('locations',5);
62 | CREATE INDEX "ix_actions_name" on actions (list_id ASC, name ASC);
63 | CREATE UNIQUE INDEX "ix_actions" on actions (_id ASC);
64 | CREATE INDEX "ix_actions_active" on actions (list_id ASC, completed desc, name ASC);
65 | CREATE INDEX "ix_actions_when" on actions (list_id ASC, completed desc, due_by_time ASC, name ASC);
66 | CREATE UNIQUE INDEX "ix_locations" on locations (_id ASC);
67 | CREATE UNIQUE INDEX "ix_locations_name" on locations (name ASC);
68 | CREATE UNIQUE INDEX "ix_action2location" on action2location (action_id ASC, location_id ASC);
69 | CREATE UNIQUE INDEX "ix_list_categories" on list_categories (_id ASC);
70 | CREATE UNIQUE INDEX "ix_list_categories_name" on list_categories (name ASC);
71 | CREATE UNIQUE INDEX "ix_lists_name" on lists (name ASC);
72 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
33 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
34 |
35 | @rem Find java.exe
36 | if defined JAVA_HOME goto findJavaFromJavaHome
37 |
38 | set JAVA_EXE=java.exe
39 | %JAVA_EXE% -version >NUL 2>&1
40 | if "%ERRORLEVEL%" == "0" goto init
41 |
42 | echo.
43 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
44 | echo.
45 | echo Please set the JAVA_HOME variable in your environment to match the
46 | echo location of your Java installation.
47 |
48 | goto fail
49 |
50 | :findJavaFromJavaHome
51 | set JAVA_HOME=%JAVA_HOME:"=%
52 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
53 |
54 | if exist "%JAVA_EXE%" goto init
55 |
56 | echo.
57 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
58 | echo.
59 | echo Please set the JAVA_HOME variable in your environment to match the
60 | echo location of your Java installation.
61 |
62 | goto fail
63 |
64 | :init
65 | @rem Get command-line arguments, handling Windows variants
66 |
67 | if not "%OS%" == "Windows_NT" goto win9xME_args
68 |
69 | :win9xME_args
70 | @rem Slurp the command line arguments.
71 | set CMD_LINE_ARGS=
72 | set _SKIP=2
73 |
74 | :win9xME_args_slurp
75 | if "x%~1" == "x" goto execute
76 |
77 | set CMD_LINE_ARGS=%*
78 |
79 | :execute
80 | @rem Setup the command line
81 |
82 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
83 |
84 | @rem Execute Gradle
85 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
86 |
87 | :end
88 | @rem End local scope for the variables with windows NT shell
89 | if "%ERRORLEVEL%"=="0" goto mainEnd
90 |
91 | :fail
92 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
93 | rem the _cmd.exe /c_ return code!
94 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
95 | exit /b 1
96 |
97 | :mainEnd
98 | if "%OS%"=="Windows_NT" endlocal
99 |
100 | :omega
101 |
--------------------------------------------------------------------------------
/app/src/main/java/eu/lastviking/app/vgtd/VikingDropdownCtl.java:
--------------------------------------------------------------------------------
1 | package eu.lastviking.app.vgtd;
2 |
3 | import java.util.ArrayList;
4 |
5 | import android.app.AlertDialog;
6 | import android.content.Context;
7 | import android.content.DialogInterface;
8 | import android.util.AttributeSet;
9 | import android.view.View;
10 | import android.widget.Button;
11 |
12 | public class VikingDropdownCtl extends Button {
13 |
14 | private String label_;
15 | private ArrayList