From 89a5ada48a41b52d5210459ccccb7ed086b72ea1 Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Wed, 5 Aug 2015 19:48:41 +0200 Subject: [PATCH] Initial commit A.k.a. "I should have done this some time ago" --- .gitignore | 191 ++++++++++++++++ app/.gitignore | 1 + app/build.gradle | 51 +++++ app/proguard-rules.pro | 17 ++ .../ch/dissem/apps/abit/ApplicationTest.java | 13 ++ app/src/main/AndroidManifest.xml | 51 +++++ .../V1.0__Create_table_inventory.sql | 8 + .../migration/V1.1__Create_table_address.sql | 8 + .../migration/V1.2__Create_table_message.sql | 40 ++++ .../apps/abit/MessageDetailActivity.java | 68 ++++++ .../apps/abit/MessageDetailFragment.java | 61 +++++ .../dissem/apps/abit/MessageListActivity.java | 215 ++++++++++++++++++ .../dissem/apps/abit/MessageListFragment.java | 177 ++++++++++++++ .../ch/dissem/apps/abit/SQLiteConfig.java | 37 +++ .../ch/dissem/apps/abit/SettingsActivity.java | 27 +++ .../ch/dissem/apps/abit/SettingsFragment.java | 18 ++ .../apps/abit/service/BitmessageService.java | 104 +++++++++ .../dissem/apps/abit/service/Singleton.java | 34 +++ .../delight/android/identicons/Identicon.java | 213 +++++++++++++++++ .../ic_action_notification_sync.png | Bin 0 -> 967 bytes .../ic_action_notification_sync_disabled.png | Bin 0 -> 1059 bytes .../main/res/drawable-hdpi/ic_plus_sign.png | Bin 0 -> 293 bytes .../ic_action_notification_sync.png | Bin 0 -> 580 bytes .../ic_action_notification_sync_disabled.png | Bin 0 -> 641 bytes .../main/res/drawable-mdpi/ic_plus_sign.png | Bin 0 -> 230 bytes .../ic_action_notification_sync.png | Bin 0 -> 1296 bytes .../ic_action_notification_sync_disabled.png | Bin 0 -> 1388 bytes .../main/res/drawable-xhdpi/ic_plus_sign.png | Bin 0 -> 409 bytes .../ic_action_notification_sync.png | Bin 0 -> 1943 bytes .../ic_action_notification_sync_disabled.png | Bin 0 -> 2048 bytes .../main/res/drawable-xxhdpi/ic_plus_sign.png | Bin 0 -> 600 bytes .../ic_action_notification_sync.png | Bin 0 -> 2779 bytes .../ic_action_notification_sync_disabled.png | Bin 0 -> 2864 bytes .../res/drawable-xxxhdpi/ic_plus_sign.png | Bin 0 -> 895 bytes app/src/main/res/drawable/header.png | Bin 0 -> 7087 bytes .../layout-sw600dp/activity_message_list.xml | 47 ++++ .../res/layout/activity_message_detail.xml | 25 ++ .../main/res/layout/activity_message_list.xml | 25 ++ .../res/layout/fragment_message_detail.xml | 9 + .../main/res/layout/fragment_message_list.xml | 27 +++ app/src/main/res/layout/toolbar_layout.xml | 26 +++ app/src/main/res/menu/main.xml | 14 ++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes app/src/main/res/values-de/strings.xml | 7 + app/src/main/res/values-v21/styles.xml | 24 ++ app/src/main/res/values/arrays.xml | 13 ++ app/src/main/res/values/colors.xml | 12 + app/src/main/res/values/strings.xml | 11 + app/src/main/res/values/styles.xml | 24 ++ app/src/main/res/xml/preferences.xml | 16 ++ build.gradle | 25 ++ gradle.properties | 18 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++++++++++++ gradlew.bat | 90 ++++++++ settings.gradle | 1 + 60 files changed, 1918 insertions(+) create mode 100644 .gitignore create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/ch/dissem/apps/abit/ApplicationTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/db/migration/V1.0__Create_table_inventory.sql create mode 100644 app/src/main/assets/db/migration/V1.1__Create_table_address.sql create mode 100644 app/src/main/assets/db/migration/V1.2__Create_table_message.sql create mode 100644 app/src/main/java/ch/dissem/apps/abit/MessageDetailActivity.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/SQLiteConfig.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/SettingsActivity.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/SettingsFragment.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/service/BitmessageService.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/service/Singleton.java create mode 100644 app/src/main/java/im/delight/android/identicons/Identicon.java create mode 100755 app/src/main/res/drawable-hdpi/ic_action_notification_sync.png create mode 100755 app/src/main/res/drawable-hdpi/ic_action_notification_sync_disabled.png create mode 100755 app/src/main/res/drawable-hdpi/ic_plus_sign.png create mode 100755 app/src/main/res/drawable-mdpi/ic_action_notification_sync.png create mode 100755 app/src/main/res/drawable-mdpi/ic_action_notification_sync_disabled.png create mode 100755 app/src/main/res/drawable-mdpi/ic_plus_sign.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_action_notification_sync.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_action_notification_sync_disabled.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_plus_sign.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_notification_sync.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_notification_sync_disabled.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_plus_sign.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_notification_sync.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_notification_sync_disabled.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_plus_sign.png create mode 100644 app/src/main/res/drawable/header.png create mode 100644 app/src/main/res/layout-sw600dp/activity_message_list.xml create mode 100644 app/src/main/res/layout/activity_message_detail.xml create mode 100644 app/src/main/res/layout/activity_message_list.xml create mode 100644 app/src/main/res/layout/fragment_message_detail.xml create mode 100644 app/src/main/res/layout/fragment_message_list.xml create mode 100644 app/src/main/res/layout/toolbar_layout.xml create mode 100644 app/src/main/res/menu/main.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-de/strings.xml create mode 100644 app/src/main/res/values-v21/styles.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml/preferences.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..80e1268 --- /dev/null +++ b/.gitignore @@ -0,0 +1,191 @@ +# Created by https://www.gitignore.io + +### Android ### +# Built application files +*.apk +*.ap_ + +# Files for the Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ + +# Gradle files +.gradle/ +build/ +/*/build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +### Android Patch ### +gen-external-apklibs + + +### Gradle ### +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties + + +### Eclipse ### +*.pydevproject +.metadata +.gradle +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# PDT-specific +.buildpath + +# sbteclipse plugin +.target + +# TeXlipse plugin +.texlipse + + +### Linux ### +*~ + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + + +### OSX ### +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +### Windows ### +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..679e0a6 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,51 @@ +apply plugin: 'idea' +apply plugin: 'com.android.application' + +android { + compileSdkVersion 22 + buildToolsVersion "21.1.2" + + defaultConfig { + applicationId "ch.dissem.apps.abit" + minSdkVersion 15 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:22.2.1' + compile 'com.android.support:support-v4:22.2.1' + compile 'com.android.support:design:22.2.1' + + compile 'ch.dissem.jabit:jabit-domain:0.2.1-SNAPSHOT' + compile 'ch.dissem.jabit:jabit-networking:0.2.1-SNAPSHOT' + compile 'ch.dissem.jabit:jabit-repositories:0.2.1-SNAPSHOT' + compile 'ch.dissem.jabit:jabit-security-spongy:0.2.1-SNAPSHOT' + + compile 'org.sqldroid:sqldroid:1.0.3' + compile 'org.slf4j:slf4j-android:1.7.12' + + compile('com.mikepenz:materialdrawer:3.1.0@aar') { + transitive = true + } +} + +idea.module { + downloadJavadoc = true + downloadSources = true +} + +android { + lintOptions { + abortOnError false + } +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..ebd5a6a --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/chris/Library/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 *; +#} diff --git a/app/src/androidTest/java/ch/dissem/apps/abit/ApplicationTest.java b/app/src/androidTest/java/ch/dissem/apps/abit/ApplicationTest.java new file mode 100644 index 0000000..bd2f7c5 --- /dev/null +++ b/app/src/androidTest/java/ch/dissem/apps/abit/ApplicationTest.java @@ -0,0 +1,13 @@ +package ch.dissem.apps.abit; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3f38a3f --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/db/migration/V1.0__Create_table_inventory.sql b/app/src/main/assets/db/migration/V1.0__Create_table_inventory.sql new file mode 100644 index 0000000..bbf98ad --- /dev/null +++ b/app/src/main/assets/db/migration/V1.0__Create_table_inventory.sql @@ -0,0 +1,8 @@ +CREATE TABLE Inventory ( + hash BINARY(32) NOT NULL PRIMARY KEY, + stream INTEGER NOT NULL, + expires INTEGER NOT NULL, + data BLOB NOT NULL, + type INTEGER NOT NULL, + version INTEGER NOT NULL +); \ No newline at end of file diff --git a/app/src/main/assets/db/migration/V1.1__Create_table_address.sql b/app/src/main/assets/db/migration/V1.1__Create_table_address.sql new file mode 100644 index 0000000..61d2107 --- /dev/null +++ b/app/src/main/assets/db/migration/V1.1__Create_table_address.sql @@ -0,0 +1,8 @@ +CREATE TABLE Address ( + address VARCHAR(40) NOT NULL PRIMARY KEY, + version INTEGER NOT NULL, + alias VARCHAR(255), + public_key BLOB, + private_key BLOB, + subscribed BIT DEFAULT '0' +); \ No newline at end of file diff --git a/app/src/main/assets/db/migration/V1.2__Create_table_message.sql b/app/src/main/assets/db/migration/V1.2__Create_table_message.sql new file mode 100644 index 0000000..03ffbbe --- /dev/null +++ b/app/src/main/assets/db/migration/V1.2__Create_table_message.sql @@ -0,0 +1,40 @@ +CREATE TABLE Message ( + id INTEGER PRIMARY KEY, + iv BINARY(32) UNIQUE, + type VARCHAR(20) NOT NULL, + sender VARCHAR(40) NOT NULL, + recipient VARCHAR(40), + data BLOB NOT NULL, + sent INTEGER, + received INTEGER, + status VARCHAR(20) NOT NULL, + + FOREIGN KEY (sender) REFERENCES Address (address), + FOREIGN KEY (recipient) REFERENCES Address (address) +); + +CREATE TABLE Label ( + id INTEGER PRIMARY KEY, + label VARCHAR(255) NOT NULL, + type VARCHAR(20), + color INT NOT NULL DEFAULT 4278190080, -- FF000000 + ord INTEGER, + + CONSTRAINT UC_label UNIQUE (label), + CONSTRAINT UC_order UNIQUE (ord) +); + +CREATE TABLE Message_Label ( + message_id INTEGER NOT NULL, + label_id INTEGER NOT NULL, + + PRIMARY KEY (message_id, label_id), + FOREIGN KEY (message_id) REFERENCES Message (id), + FOREIGN KEY (label_id) REFERENCES Label (id) +); + +INSERT INTO Label(label, type, color, ord) VALUES ('Inbox', 'INBOX', 4278190335, 0); +INSERT INTO Label(label, type, color, ord) VALUES ('Drafts', 'DRAFT', 4294940928, 10); +INSERT INTO Label(label, type, color, ord) VALUES ('Sent', 'SENT', 4294967040, 20); +INSERT INTO Label(label, type, ord) VALUES ('Unread', 'UNREAD', 90); +INSERT INTO Label(label, type, ord) VALUES ('Trash', 'TRASH', 100); diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageDetailActivity.java b/app/src/main/java/ch/dissem/apps/abit/MessageDetailActivity.java new file mode 100644 index 0000000..842cc75 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/MessageDetailActivity.java @@ -0,0 +1,68 @@ +package ch.dissem.apps.abit; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; +import android.support.v4.app.NavUtils; +import android.view.MenuItem; + + +/** + * An activity representing a single Message detail screen. This + * activity is only used on handset devices. On tablet-size devices, + * item details are presented side-by-side with a list of items + * in a {@link MessageListActivity}. + *

+ * This activity is mostly just a 'shell' activity containing nothing + * more than a {@link MessageDetailFragment}. + */ +public class MessageDetailActivity extends ActionBarActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_message_detail); + + // Show the Up button in the action bar. + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + // savedInstanceState is non-null when there is fragment state + // saved from previous configurations of this activity + // (e.g. when rotating the screen from portrait to landscape). + // In this case, the fragment will automatically be re-added + // to its container so we don't need to manually add it. + // For more information, see the Fragments API guide at: + // + // http://developer.android.com/guide/components/fragments.html + // + if (savedInstanceState == null) { + // Create the detail fragment and add it to the activity + // using a fragment transaction. + Bundle arguments = new Bundle(); + arguments.putString(MessageDetailFragment.ARG_ITEM, + getIntent().getStringExtra(MessageDetailFragment.ARG_ITEM)); + MessageDetailFragment fragment = new MessageDetailFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .add(R.id.message_detail_container, fragment) + .commit(); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + // This ID represents the Home or Up button. In the case of this + // activity, the Up button is shown. Use NavUtils to allow users + // to navigate up one level in the application structure. For + // more details, see the Navigation pattern on Android Design: + // + // http://developer.android.com/design/patterns/navigation.html#up-vs-back + // + NavUtils.navigateUpTo(this, new Intent(this, MessageListActivity.class)); + return true; + } + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java b/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java new file mode 100644 index 0000000..8b430aa --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java @@ -0,0 +1,61 @@ +package ch.dissem.apps.abit; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import ch.dissem.bitmessage.entity.Plaintext; + + +/** + * A fragment representing a single Message detail screen. + * This fragment is either contained in a {@link MessageListActivity} + * in two-pane mode (on tablets) or a {@link MessageDetailActivity} + * on handsets. + */ +public class MessageDetailFragment extends Fragment { + /** + * The fragment argument representing the item ID that this fragment + * represents. + */ + public static final String ARG_ITEM = "item"; + + /** + * The dummy content this fragment is presenting. + */ + private Plaintext item; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public MessageDetailFragment() { + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (getArguments().containsKey(ARG_ITEM)) { + // Load the dummy content specified by the fragment + // arguments. In a real-world scenario, use a Loader + // to load content from a content provider. + item = (Plaintext) getArguments().getSerializable(ARG_ITEM); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_message_detail, container, false); + + // Show the dummy content as text in a TextView. + if (item != null) { + ((TextView) rootView.findViewById(R.id.message_detail)).setText(item.getText()); + } + + return rootView; + } +} diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java new file mode 100644 index 0000000..94376e3 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java @@ -0,0 +1,215 @@ +package ch.dissem.apps.abit; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.Menu; +import android.view.View; +import android.widget.AdapterView; +import ch.dissem.apps.abit.service.Singleton; +import ch.dissem.bitmessage.BitmessageContext; +import ch.dissem.bitmessage.entity.BitmessageAddress; +import ch.dissem.bitmessage.entity.Plaintext; +import ch.dissem.bitmessage.entity.valueobject.Label; +import com.mikepenz.google_material_typeface_library.GoogleMaterial; +import com.mikepenz.iconics.IconicsDrawable; +import com.mikepenz.materialdrawer.Drawer; +import com.mikepenz.materialdrawer.DrawerBuilder; +import com.mikepenz.materialdrawer.accountswitcher.AccountHeader; +import com.mikepenz.materialdrawer.accountswitcher.AccountHeaderBuilder; +import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; +import com.mikepenz.materialdrawer.model.ProfileDrawerItem; +import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem; +import com.mikepenz.materialdrawer.model.SecondaryDrawerItem; +import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; +import com.mikepenz.materialdrawer.model.interfaces.IProfile; +import com.mikepenz.materialdrawer.model.interfaces.Nameable; + +import java.util.ArrayList; + + +/** + * An activity representing a list of Messages. This activity + * has different presentations for handset and tablet-size devices. On + * handsets, the activity presents a list of items, which when touched, + * lead to a {@link MessageDetailActivity} representing + * item details. On tablets, the activity presents the list of items and + * item details side-by-side using two vertical panes. + *

+ * The activity makes heavy use of fragments. The list of items is a + * {@link MessageListFragment} and the item details + * (if present) is a {@link MessageDetailFragment}. + *

+ * This activity also implements the required + * {@link MessageListFragment.Callbacks} interface + * to listen for item selections. + *

+ */ +public class MessageListActivity extends AppCompatActivity + implements MessageListFragment.Callbacks { + private static final int ADD_IDENTITY = 1; + + /** + * Whether or not the activity is in two-pane mode, i.e. running on a tablet + * device. + */ + private boolean twoPane; + + private AccountHeader accountHeader; + private BitmessageContext bmc; + private Label selectedLabel; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + bmc = Singleton.getBitmessageContext(this); + selectedLabel = bmc.messages().getLabels().get(0); + + setContentView(R.layout.activity_message_list); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + if (findViewById(R.id.message_detail_container) != null) { + // The detail container view will be present only in the + // large-screen layouts (res/values-large and + // res/values-sw600dp). If this view is present, then the + // activity should be in two-pane mode. + twoPane = true; + + // In two-pane mode, list items should be given the + // 'activated' state when touched. + ((MessageListFragment) getSupportFragmentManager() + .findFragmentById(R.id.message_list)) + .setActivateOnItemClick(true); + } + + createDrawer(toolbar); + + // TODO: If exposing deep links into your app, handle intents here. + } + + private void createDrawer(Toolbar toolbar) { + final ArrayList profiles = new ArrayList<>(); + for (BitmessageAddress identity : bmc.addresses().getIdentities()) { + profiles.add(new ProfileDrawerItem() + .withName(identity.toString()) + .withEmail(identity.getAddress()) + .withTag(identity) + ); + } + profiles.add(new ProfileSettingDrawerItem() + .withName("Add Identity") + .withDescription("Create new identity") + .withIcon(new IconicsDrawable(this, GoogleMaterial.Icon.gmd_add) + .actionBar() + .paddingDp(5) + .colorRes(R.color.icons)) + .withIdentifier(ADD_IDENTITY) + ); + profiles.add(new ProfileSettingDrawerItem() + .withName("Manage Account") + .withIcon(GoogleMaterial.Icon.gmd_settings) + ); + // Create the AccountHeader + accountHeader = new AccountHeaderBuilder() + .withActivity(this) + .withHeaderBackground(R.drawable.header) + .withProfiles(profiles) + .withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() { + @Override + public boolean onProfileChanged(View view, IProfile profile, boolean currentProfile) { + if (profile.getIdentifier() == ADD_IDENTITY) { + BitmessageAddress identity = bmc.createIdentity(false); + IProfile newProfile = new ProfileDrawerItem() + .withName(identity.toString()) + .withEmail(identity.getAddress()) + .withTag(identity); + if (accountHeader.getProfiles() != null) { + //we know that there are 2 setting elements. set the new profile above them ;) + accountHeader.addProfile(newProfile, accountHeader.getProfiles().size() - 2); + } else { + accountHeader.addProfiles(newProfile); + } + } + // false if it should close the drawer + return false; + } + }) + .build(); + + ArrayList drawerItems = new ArrayList<>(); + for (Label label : bmc.messages().getLabels()) { + drawerItems.add(new PrimaryDrawerItem().withName(label.toString()).withTag(label)); + } + + new DrawerBuilder() + .withActivity(this) + .withToolbar(toolbar) + .withAccountHeader(accountHeader) + .withDrawerItems(drawerItems) + .addStickyDrawerItems( + new SecondaryDrawerItem() + .withName(R.string.settings) + .withIcon(GoogleMaterial.Icon.gmd_settings) + ) + .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { + @Override + public boolean onItemClick(AdapterView adapterView, View view, int i, long l, IDrawerItem item) { + if (item.getTag() instanceof Label) { + selectedLabel = (Label) item.getTag(); + } else if (item instanceof Nameable) { + Nameable ni = (Nameable) item; + switch (ni.getNameRes()) { + case R.string.settings: + startActivity(new Intent(MessageListActivity.this, SettingsActivity.class)); + break; + } + } + return false; + } + }) + .build(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + boolean running = bmc.isRunning(); + menu.findItem(R.id.sync_enabled).setVisible(running); + menu.findItem(R.id.sync_disabled).setVisible(!running); + return true; + } + + /** + * Callback method from {@link MessageListFragment.Callbacks} + * indicating that the item with the given ID was selected. + */ + @Override + public void onItemSelected(Plaintext plaintext) { + if (twoPane) { + // In two-pane mode, show the detail view in this activity by + // adding or replacing the detail fragment using a + // fragment transaction. + Bundle arguments = new Bundle(); + arguments.putSerializable(MessageDetailFragment.ARG_ITEM, plaintext); + MessageDetailFragment fragment = new MessageDetailFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.message_detail_container, fragment) + .commit(); + + } else { + // In single-pane mode, simply start the detail activity + // for the selected item ID. + Intent detailIntent = new Intent(this, MessageDetailActivity.class); + detailIntent.putExtra(MessageDetailFragment.ARG_ITEM, plaintext); + startActivity(detailIntent); + } + } + + public Label getSelectedLabel() { + return selectedLabel; + } +} diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java new file mode 100644 index 0000000..f6d09d8 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java @@ -0,0 +1,177 @@ +package ch.dissem.apps.abit; + +import android.app.Activity; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.ListFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; +import ch.dissem.apps.abit.service.Singleton; +import ch.dissem.bitmessage.BitmessageContext; +import ch.dissem.bitmessage.entity.Plaintext; + +/** + * A list fragment representing a list of Messages. This fragment + * also supports tablet devices by allowing list items to be given an + * 'activated' state upon selection. This helps indicate which item is + * currently being viewed in a {@link MessageDetailFragment}. + *

+ * Activities containing this fragment MUST implement the {@link Callbacks} + * interface. + */ +public class MessageListFragment extends ListFragment { + + /** + * The serialization (saved instance state) Bundle key representing the + * activated item position. Only used on tablets. + */ + private static final String STATE_ACTIVATED_POSITION = "activated_position"; + + /** + * The fragment's current callback object, which is notified of list item + * clicks. + */ + private Callbacks mCallbacks = sDummyCallbacks; + + /** + * The current activated item position. Only used on tablets. + */ + private int mActivatedPosition = ListView.INVALID_POSITION; + + private BitmessageContext bmc; + + /** + * A callback interface that all activities containing this fragment must + * implement. This mechanism allows activities to be notified of item + * selections. + */ + public interface Callbacks { + /** + * Callback for when an item has been selected. + */ + void onItemSelected(Plaintext plaintext); + } + + /** + * A dummy implementation of the {@link Callbacks} interface that does + * nothing. Used only when this fragment is not attached to an activity. + */ + private static Callbacks sDummyCallbacks = new Callbacks() { + @Override + public void onItemSelected(Plaintext plaintext) { + } + }; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public MessageListFragment() { + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + bmc = Singleton.getBitmessageContext(getActivity()); + + // TODO: replace with a real list adapter. + setListAdapter(new ArrayAdapter<>( + getActivity(), + android.R.layout.simple_list_item_activated_1, + android.R.id.text1, + bmc.messages().findMessages(((MessageListActivity) getActivity()).getSelectedLabel()))); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_message_list, container, false); + + // Show the dummy content as text in a TextView. + FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab_compose_message); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(MessageListFragment.this.getActivity(), "TODO", Toast.LENGTH_SHORT).show(); + } + }); + + return rootView; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + // Restore the previously serialized activated item position. + if (savedInstanceState != null + && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { + setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); + } + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + // Activities containing this fragment must implement its callbacks. + if (!(activity instanceof Callbacks)) { + throw new IllegalStateException("Activity must implement fragment's callbacks."); + } + + mCallbacks = (Callbacks) activity; + } + + @Override + public void onDetach() { + super.onDetach(); + + // Reset the active callbacks interface to the dummy implementation. + mCallbacks = sDummyCallbacks; + } + + @Override + public void onListItemClick(ListView listView, View view, int position, long id) { + super.onListItemClick(listView, view, position, id); + + // Notify the active callbacks interface (the activity, if the + // fragment is attached to one) that an item has been selected. + mCallbacks.onItemSelected((Plaintext) listView.getItemAtPosition(position)); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mActivatedPosition != ListView.INVALID_POSITION) { + // Serialize and persist the activated item position. + outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); + } + } + + /** + * Turns on activate-on-click mode. When this mode is on, list items will be + * given the 'activated' state when touched. + */ + public void setActivateOnItemClick(boolean activateOnItemClick) { + // When setting CHOICE_MODE_SINGLE, ListView will automatically + // give items the 'activated' state when touched. + getListView().setChoiceMode(activateOnItemClick + ? ListView.CHOICE_MODE_SINGLE + : ListView.CHOICE_MODE_NONE); + } + + private void setActivatedPosition(int position) { + if (position == ListView.INVALID_POSITION) { + getListView().setItemChecked(mActivatedPosition, false); + } else { + getListView().setItemChecked(position, true); + } + + mActivatedPosition = position; + } +} diff --git a/app/src/main/java/ch/dissem/apps/abit/SQLiteConfig.java b/app/src/main/java/ch/dissem/apps/abit/SQLiteConfig.java new file mode 100644 index 0000000..6b230d2 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/SQLiteConfig.java @@ -0,0 +1,37 @@ +package ch.dissem.apps.abit; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.os.Environment; +import ch.dissem.bitmessage.repository.JdbcConfig; +import org.flywaydb.core.api.android.ContextHolder; +import org.sqldroid.SQLDroidDriver; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +/** + * Created by chris on 14.07.15. + */ +public class SQLiteConfig extends JdbcConfig { + + public SQLiteConfig(Context ctx) { + super(getDbUrl(ctx), "", ""); + } + + private static String getDbUrl(Context ctx) { + SQLiteDatabase db = ctx.openOrCreateDatabase(Environment.getExternalStorageDirectory() + + "/jabit.db", Context.MODE_PRIVATE, null); + ContextHolder.setContext(ctx); + return "jdbc:sqlite:" + db.getPath() + "?timeout=5"; + } + + @Override + public Connection getConnection() throws SQLException { + Properties removeLocale = new Properties(); + removeLocale.put(SQLDroidDriver.ADDITONAL_DATABASE_FLAGS, android.database.sqlite.SQLiteDatabase.NO_LOCALIZED_COLLATORS); + return DriverManager.getConnection(dbUrl, removeLocale); + } +} diff --git a/app/src/main/java/ch/dissem/apps/abit/SettingsActivity.java b/app/src/main/java/ch/dissem/apps/abit/SettingsActivity.java new file mode 100644 index 0000000..670e299 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/SettingsActivity.java @@ -0,0 +1,27 @@ +package ch.dissem.apps.abit; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; + +/** + * Created by chris on 14.07.15. + */ +public class SettingsActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.toolbar_layout); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(false); + + // Display the fragment as the main content. + getFragmentManager().beginTransaction() + .replace(R.id.content, new SettingsFragment()) + .commit(); + } +} \ No newline at end of file diff --git a/app/src/main/java/ch/dissem/apps/abit/SettingsFragment.java b/app/src/main/java/ch/dissem/apps/abit/SettingsFragment.java new file mode 100644 index 0000000..ffba5a9 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/SettingsFragment.java @@ -0,0 +1,18 @@ +package ch.dissem.apps.abit; + +import android.os.Bundle; +import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; + +/** + * Created by chris on 14.07.15. + */ +public class SettingsFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.preferences); + } +} \ No newline at end of file diff --git a/app/src/main/java/ch/dissem/apps/abit/service/BitmessageService.java b/app/src/main/java/ch/dissem/apps/abit/service/BitmessageService.java new file mode 100644 index 0000000..a55d3e1 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/service/BitmessageService.java @@ -0,0 +1,104 @@ +package ch.dissem.apps.abit.service; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Binder; +import android.os.IBinder; +import android.support.v7.app.NotificationCompat; +import ch.dissem.apps.abit.R; +import ch.dissem.bitmessage.BitmessageContext; +import ch.dissem.bitmessage.entity.BitmessageAddress; +import ch.dissem.bitmessage.entity.Plaintext; +import ch.dissem.bitmessage.entity.valueobject.Label; + +import java.util.List; + +public class BitmessageService extends Service { + private static BitmessageContext ctx; + private ServiceBinder binder = new ServiceBinder(); + private NotificationCompat.Builder ongoingNotificationBuilder = new NotificationCompat.Builder(this); + private NotificationManager notifyManager; + + public BitmessageService() { + if (ctx == null) { + ctx = Singleton.getBitmessageContext(this); + } + } + + @Override + public void onCreate() { + super.onCreate(); + ongoingNotificationBuilder.setOngoing(true); + ongoingNotificationBuilder.setContentTitle(getString(R.string.bitmessage_active)); + ongoingNotificationBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); +// ongoingNotificationBuilder.setSmallIcon(R.drawable.ic_bitmessage); + notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + + public void startService() { + if (!ctx.isRunning()) { + notifyManager.notify(0, ongoingNotificationBuilder.build()); + ctx.startup(new BitmessageContext.Listener() { + @Override + public void receive(Plaintext plaintext) { + Notification notification = new NotificationCompat.Builder(BitmessageService.this) + .setContentTitle(plaintext.getSubject()) + .setContentText(plaintext.getText()) + .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) + .setPriority(plaintext.getType() == Plaintext.Type.BROADCAST + ? NotificationCompat.PRIORITY_DEFAULT + : NotificationCompat.PRIORITY_HIGH) + .build(); + notifyManager.notify(plaintext.getInventoryVector().hashCode(), notification); + } + }); + } + } + + public void stopService() { + ctx.shutdown(); + notifyManager.cancel(0); + } + + public List getIdentities() { + return ctx.addresses().getIdentities(); + } + + public List getContacts() { + return ctx.addresses().getContacts(); + } + + public List

getMessages(Label label) { + return ctx.messages().findMessages(label); + } + + @Override + public IBinder onBind(Intent intent) { + return binder; + } + + public class ServiceBinder extends Binder { + public BitmessageService getService() { + return BitmessageService.this; + } + } + + public enum NetworkChoice { + /** + * A full node, receiving and relaying objects all the time. + */ + FULL, + /** + * Connect to a trusted node from time to time to get all new objects and disconnect afterwards + * (see {@link android.content.AbstractThreadedSyncAdapter}) + */ + TRUSTED, + /** + * Offline + */ + NONE + } +} diff --git a/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java b/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java new file mode 100644 index 0000000..c8b33a6 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java @@ -0,0 +1,34 @@ +package ch.dissem.apps.abit.service; + +import android.content.Context; +import ch.dissem.apps.abit.SQLiteConfig; +import ch.dissem.bitmessage.BitmessageContext; +import ch.dissem.bitmessage.networking.DefaultNetworkHandler; +import ch.dissem.bitmessage.repository.*; +import ch.dissem.bitmessage.security.sc.SpongySecurity; + +/** + * Created by chris on 16.07.15. + */ +public class Singleton { + private static BitmessageContext bitmessageContext; + + public static BitmessageContext getBitmessageContext(Context ctx) { + if (bitmessageContext == null) { + synchronized (Singleton.class) { + if (bitmessageContext == null) { + JdbcConfig config = new SQLiteConfig(ctx); + bitmessageContext = new BitmessageContext.Builder() + .security(new SpongySecurity()) + .nodeRegistry(new MemoryNodeRegistry()) + .inventory(new JdbcInventory(config)) + .addressRepo(new JdbcAddressRepository(config)) + .messageRepo(new JdbcMessageRepository(config)) + .networkHandler(new DefaultNetworkHandler()) + .build(); + } + } + } + return bitmessageContext; + } +} diff --git a/app/src/main/java/im/delight/android/identicons/Identicon.java b/app/src/main/java/im/delight/android/identicons/Identicon.java new file mode 100644 index 0000000..c419318 --- /dev/null +++ b/app/src/main/java/im/delight/android/identicons/Identicon.java @@ -0,0 +1,213 @@ +package im.delight.android.identicons; + +/** + * Copyright 2014 www.delight.im <info@delight.im> + * + * 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. + */ + +import java.security.MessageDigest; +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; + +abstract public class Identicon extends View { + + private static final String HASH_ALGORITHM = "SHA-256"; + private final int mRowCount; + private final int mColumnCount; + private final Paint mPaint; + private volatile int mCellWidth; + private volatile int mCellHeight; + private volatile byte[] mHash; + private volatile int[][] mColors; + private volatile boolean mReady; + + public Identicon(Context context) { + super(context); + + mRowCount = getRowCount(); + mColumnCount = getColumnCount(); + mPaint = new Paint(); + + init(); + } + + public Identicon(Context context, AttributeSet attrs) { + super(context, attrs); + + mRowCount = getRowCount(); + mColumnCount = getColumnCount(); + mPaint = new Paint(); + + init(); + } + + public Identicon(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + mRowCount = getRowCount(); + mColumnCount = getColumnCount(); + mPaint = new Paint(); + + init(); + } + + @SuppressLint("NewApi") + protected void init() { + mPaint.setStyle(Paint.Style.FILL); + mPaint.setAntiAlias(true); + mPaint.setDither(true); + + setWillNotDraw(false); + if (Build.VERSION.SDK_INT >= 11) { + setLayerType(View.LAYER_TYPE_SOFTWARE, null); + } + } + + public void show(String input) { + // if the input was null + if (input == null) { + // we can't create a hash value and have nothing to show (draw to the view) + mHash = null; + } + // if the input was a proper string (non-null) + else { + // generate a hash from the string to get unique but deterministic byte values + try { + final MessageDigest digest = java.security.MessageDigest.getInstance(HASH_ALGORITHM); + digest.update(input == null ? new byte[0] : input.getBytes()); + mHash = digest.digest(); + } + catch (Exception e) { + mHash = null; + } + } + + // set up the cell colors according to the input that was provided via show(...) + setupColors(); + + // this view may now be drawn (and thus must be re-drawn) + mReady = true; + invalidate(); + } + + public void show(int input) { + show(String.valueOf(input)); + } + + public void show(long input) { + show(String.valueOf(input)); + } + + public void show(float input) { + show(String.valueOf(input)); + } + + public void show(double input) { + show(String.valueOf(input)); + } + + public void show(byte input) { + show(String.valueOf(input)); + } + + public void show(char input) { + show(String.valueOf(input)); + } + + public void show(boolean input) { + show(String.valueOf(input)); + } + + public void show(Object input) { + if (input == null) { + mHash = null; + } + else { + show(String.valueOf(input)); + } + } + + protected void setupColors() { + mColors = new int[mRowCount][mColumnCount]; + int colorVisible = getIconColor(); + + for (int r = 0; r < mRowCount; r++) { + for (int c = 0; c < mColumnCount; c++) { + if (isCellVisible(r, c)) { + mColors[r][c] = colorVisible; + } + else { + mColors[r][c] = Color.TRANSPARENT; + } + } + } + } + + protected byte getByte(int index) { + if (mHash == null) { + return -128; + } + else { + return mHash[index % mHash.length]; + } + } + + abstract protected int getRowCount(); + + abstract protected int getColumnCount(); + + abstract protected boolean isCellVisible(int row, int column); + + abstract protected int getIconColor(); + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + mCellWidth = w / mColumnCount; + mCellHeight = h / mRowCount; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int size = Math.min(getMeasuredWidth(), getMeasuredHeight()); + setMeasuredDimension(size, size); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mReady) { + int x, y; + for (int r = 0; r < mRowCount; r++) { + for (int c = 0; c < mColumnCount; c++) { + x = mCellWidth * c; + y = mCellHeight * r; + + mPaint.setColor(mColors[r][c]); + + canvas.drawRect(x, y + mCellHeight, x + mCellWidth, y, mPaint); + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_action_notification_sync.png b/app/src/main/res/drawable-hdpi/ic_action_notification_sync.png new file mode 100755 index 0000000000000000000000000000000000000000..d938029163421b0b20417517e44df7ed0ef7cff3 GIT binary patch literal 967 zcmV;&133JNP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000AyNkl<ZXhZFp zPw1s%6vsc`8h`RH$)FgKSSTs8m}X;?hFHwV!pKI#&O%7@FKRGM!(?GeWHHU`W^6E0 z*kFMu5?M?ke<q2cA$9bf&aJ20eSi0Tp5J?a)2;i|?RM|`JkL3w=X=h1&wa0$^PxHS zp9R3FR&b%fLV;zTz)V9ZBCeA3-7<Y#a{0^v>^$&{q`T)1Af4X<TrX+uTmg(u9=O_$ z&lNy<^2Mp&1{|04_bikcEC<F<zHs&@;1A#^@CERJr0<7<84|!Te`gQJeg)nI4oUj9 z$NZJ4LJ@H-up3y@)2U;?i;~{#Ie+4`!4&ZB5pj`ACvZbyZ5?niV8EO5b!J}w4>%}k zUn|6*010s=uzdtkR-uSk1-Pu<3mDA95Kl;Yy9J^NAR;cbVM)JFGFmDzsf<R%1;9>V zL#}r?J=BsDtpJY!mjgQ_{n-I=QVB^9c3d~a(}fZTB<-zLp&B3}E(Kl&9PfvLJ(B+E zQbN)%T~0-W!^rXPoN#q|pti)e0NevSnoc=x9lws_>XA9I3%E5GzaVLU%|<N%&jPok zk!_NW)EFF}8xb3U=kog_lD5_CR|OCeX9KT{`W#?$t>hB`F3V8#rEh@yYub)lfJ=Z^ zGyZLGy`+C@PHY0eX~0MMz1xoamdcy)^|b)LAsN8$9_w1;f8<C+oDO`LpMOpOzxNuo z0B2<gU6Z?SlJr9_OC6IUq6{JTMh>CB`tDf;;7udK3FpM~*edCrzQ!iaiwGA47Y2{n zCUF9kW%MoJ$<{E+GWt|e)mEg8T5{jWRs$!1M<jjRrGi7Gt5QY88CDV41UT+}Bm1#N z(drON6&?q+q#--MQ_^o8A@aK0Y)M~tTt7G4@S~ERuW{aUTLJug_a(qhoyYs`YbHTN z#3#U)*%wXxB^D9q1FIytsjC`I0I9<5j(;02lz0vJw9JVF@DxLIDpBQiF}WEaA>0$) zRX{i=-pkil8P{cgEU82b#IgVq!cQF@F2ZS=A5K=c;h#;L*ysAP0TRMFaR+d7R;OvU z-vD+=ifI$4T^|HsWF+sZHv-oIR{-Y$?w`uxyR8)%<eBN90Hv1^;kM%(pnU4^c|I>4 z#QEkjI!)Fw5SLMpK~H{UV`d5zVP$~9Pkto<4h$Ld<La-30yF)SW99%g`O-3X0nl=4 pL#|mUFyv{r?6pv!<<y2;^FQ(<H9&Q%-n;++002ovPDHLkV1hf%z1#o* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_action_notification_sync_disabled.png b/app/src/main/res/drawable-hdpi/ic_action_notification_sync_disabled.png new file mode 100755 index 0000000000000000000000000000000000000000..c8bcece5bc975b31264cb7f77d415c01cd302bbe GIT binary patch literal 1059 zcmV+;1l;?HP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000B(Nkl<ZXhZFo zNyr^l5QV>k8k}$;8V3|XP*Biq5JWKIfD2tHiXy={p%_qN9O6RMg#(yuL<9#E6$K%S zECh`hag_wYl?dX(8I229Do#*xLiMB5fA`;gU*|mu^o8*F)3<NcsZ(`sRg1%X=`i=7 z3Bdo&;Kabhz{m(pDKs*GqhFsG7#+fq2P}<&h_J0wfumOO`EOvqq!@~;2tY)f51a?= zl=N@YNJN|lTmXC`>96|ph&Ud25jeBMIq!cN*s%}*>HMR>*=gv_3PePl2y6r{1O5ay zNcyb>z#G6>EdVO#XJ;OA1|s5WU@LGeV1qA7dfkRHx{oD*Z|4B;Jn&W<t9?L9Q^*mv zqfQ5}nc;{y2DleE64)-u`8-<*vW<aHCEeZUXxH;n0N%eI*qjA<5cLsZ=jo^qgKh)x zkC~P9@jM`k08|Dd;s)U1{QE#U^`$_A0l)KO){~F<8Q3K0>rxQ&0@woFR5R9Fgf#$` zQmf5-z~jKWJm(!r&n+B4M4SP<0-Ow(eh0y+vnmq_!0)|Zu@w<^emih<vT(a3voUxT zGY}Cs0}rHyUBKsni?C8BM|XuBMueYV4D7DSuYo@aT$$%RE9u?A-e>em_FFQa2Cm4L zEUO;^*8%s{CAP07YV~wE@JtmDNj`J%Dq<iajsso=&PfZ`O8Oz&1Q+(EJ|>!;WlHYM z|Nj!WL((5Z5tIUO0lo&TO#>HIdY>RxFi~B0T@FQrd!xPi-1)yz(l3hwa7qI3uh+V! z=0`;5W!L6ZM63b!<g@(=z`ui5DFZG<r_i~1`ZbcQ=d+bebY6BnDfAU!CHj4k_lKZ} zACcrDUa=ZXbV_VQSP(1>Ub_}r#I_I-Hv$i(!4KRU)nw7>a24<o;6gMLzN}g$Hd~Ln zjBb<k_R#2iUr`DrfYURLT*z*nH%r==xqKIJ32<B0PDjM`T@srB?$2A@g=+;mC?)&A z6az>Q^;TkEUPe}+4cX(&=7Bzm%`WzdoW!>EIoy0cF8~iUFVy7pd%)9}Z`Kv_K$pbU zS_*fnYb5=;6adM>rCEH<8MkYoaj<U5%dYC3THB5i5OXn58Hfm9Y8N&Pt~QZ9m_>eI zZfH(+C5~5n=K@eGSkJ-D)dj#Q<`MLymUosjQfBH{D(}pKts+_XsSkj^X6y#O18!}b z>`Is@VjyMDdF+2}&fB&N`kt1r5+`Ik{aMxXw_J9<2X-tHz!4cS|8^}$_@^P?c4}>h zFFP~$l%y{f2B75NlD+xK=9^OIZKEiKN}O8O-U-06BHd+YVqjumWCW%Z8X3URuTKn& d4&lfH{sWr?uRudbvR?oI002ovPDHLkV1fpW-(~;+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_plus_sign.png b/app/src/main/res/drawable-hdpi/ic_plus_sign.png new file mode 100755 index 0000000000000000000000000000000000000000..b1fbbf8c1241ae497eee6fd7cc01ef31536acc6c GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtH=ZtzAsNnZryt}!WFWxu{nW#= z^Sv^fK<LMFUrRTSx&<8;?cto8X4E{k{+)K+&f4UMc=P&rkq_CdfefrZOc5toGTIk6 z^j`33U{Z6it}$ly(q#8MzUz>tlH9i}dzBlT8a6NSp8Hu!(45PmQQs!O>!6clT+Sm^ zuLzCD@+;r_+GGcL2k)JAW97d+-m}84UAg*Z*S7;_<UGSxAKo?V?tQTjb>}6|JFQNe za71&;!YkEWsYQz&+Jv}FG!hkcrl?%l(cAZTh52j$_VT-}mu{9zcraQ!<oPu+X(R|8 oZ~{6=hBc=pjY-6S@zz8CStUh=jvgM#Kz}oMy85}Sb4q9e0Gr5kQUCw| literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_action_notification_sync.png b/app/src/main/res/drawable-mdpi/ic_action_notification_sync.png new file mode 100755 index 0000000000000000000000000000000000000000..f051d5ec3d3de66def49e39d2461e33039baa43b GIT binary patch literal 580 zcmV-K0=xZ*P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80006DNkl<ZSV!%a zJ!=+06osE7f=v`Z3L7C+RP3xoN#{RM15wDAg%&Dku+k<?>@<Z6`2bCbm_QQ$K}r>D ztV9zlAyptjqA4Qil^f=T@g;e8c2*Js?^Mg~?A~Y2oO^b}E)VT;eVPD!TLCk>Ch2t* zA7v}x#eqAL&hI#YnLPw9g~AtsHA#PRKuRlMW><mxQL$BE8TbUuNm?iak^|7|(r;7b zColtyOY-Z&Q5wL%XlB=eo4|g+J<tlY13kb&;IluMv|dDz1Yl+@@rulBAK*%Ok#n^o zW_A`B08RieB|WPQU}h%)H(kG^m8jSzgrpa7kpM9Sn<;yv$P<MMnArp1GB70RRndyV z7WDzQgDD?1dZ!^kka`k04RlKSnh4MaOb0J?H)_!$fWyEna0Iv@X(JKf0Pqg*7VVJq zeY^Kk0KBb^y4xlF+GzkcTFw@@ai@SUKv(t_1VhzK_*Bw(q5@sO-O45m0H=U4z_b3I zq>puNcMBMn^gC+NW55$&P|{*{7epWQ==I=P@}P+!%<Ka&u?56G;gw~=2%rTR3GMj9 zvmSU0d;{JCzWNDC&r`N2o>Le^br2pfR{#gvYK%&9(BzQ}5P`TSJQ>db$3u(O9zQO7 zLMjbV_b)gE%!hk#Bn>7nJxt67h(O!}-lAD&!~X$L>0nwJpseKe^P2!o1^xooe8C~E S!y|M60000<MNUMnLSTY+>F)9X literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_action_notification_sync_disabled.png b/app/src/main/res/drawable-mdpi/ic_action_notification_sync_disabled.png new file mode 100755 index 0000000000000000000000000000000000000000..d8e45269053600a30ca7004c3c5cb9aee6fffa9e GIT binary patch literal 641 zcmV-{0)G98P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80006=Nkl<ZSV!%a z&5Mmu9LGOjk{L;e@seaiENm4kWn=5DB*HWc%8n9$fP^dtMN>m)C`5^cvSe>X>@_T; z$Xmuw-`ja~dS>o@ZqL1SOZU{R+kN?+@A<x+NA!59$NSR<&}ZQPVIU%gfZ3%~O-cIL zDrqelh=^^#3SdIg9}kL%b--5OhNNHVvjN~Xusqvr3b-a|q85ON@M#_-03I|R5%Yji zU>UGS(vJ+lJz!<F*_8yc0le9&Vqh(B7FYu`1_BEJGxJE2Pia=nKn`FM*e&UMRnb+N zFd_`Xr(SGIXF62|z&`j2ECj|RUF`+{Yd!|d2Yx4A$MeA%fQP^<;9~lIMAEz35+r(0 z1G|97z{XsT%$Rd6i=?ONKZk*1mPL{!tnGnWz%5`sus2Qdz*WuUNB}I`UEnovKvL8- zp|!jZECRMj`k6doZ7oS79p&K>VMbm8pHf;rcLKofwgES1xu2GfLXIpIFS-H165Iqf zSc2S8iHRBINM&^gc#|Y(+6C>z@RTzRT$Xe_op2}c1XvABlOrPb0mofrlFrmNVOG74 zq1Opu6R^E#!i<S>SzQ3mNqXB6fCS<wFamr5T*n_uRa|)DUpjyRN#8myq6A>j)e9_1 z1K*bb%mGdUJDQbMtrVoqeJLFQhO;4M07YC4#HV&8cjYp23J#^0-xtf5&Hn5*bSE4H zo|Ve#k|bZ#9W~)nAm7}>T0UqbW1a^L;CXETRR(JHy`LwF>$)cZ+67-(MC}f$`@24X bJ_CON+;#UMEIbiV00000NkvXXu0mjfMFkG{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_plus_sign.png b/app/src/main/res/drawable-mdpi/ic_plus_sign.png new file mode 100755 index 0000000000000000000000000000000000000000..478b2c74615c150e3a08ff95872000a346e83147 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJwVp1HArbCxryk^OHsEpH@4tcJ zRmz<k3qEgf%=c;A#V{u(@{?j$SCfyb_{--rG(Mg_|9_)GrAJY%Km%7mqc_)ztaL-M ziMCSD4I0Gf@BLuRRmi%4eS^gT4W(!oR;D}7jOH=C*>V*>cl$GB@xPEvHWSsj^KXSu zS~dIpYUT@BwX7F>j{j%Au{LP_1C86OPSrPXMW~<2c5}5Vx>dO3bM5WRe>&<yU%ZfE d3SiXwz-V|fLNU8b^&8OP44$rjF6*2UngAv_S$6;c literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_action_notification_sync.png b/app/src/main/res/drawable-xhdpi/ic_action_notification_sync.png new file mode 100755 index 0000000000000000000000000000000000000000..7e1ffedb3e0c682c98bd9b7ee51d8b07c5cf2d1a GIT binary patch literal 1296 zcmV+r1@HQaP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000EnNkl<ZcwX(A zc?f4y6vsbbdrZmN*o!P#iewsVBuT;_{4th>7(2~O#vhbjQll7TFk?-Yk{C&ZKWtgj z$d(zQEXfin$$oUkeRX@@@Auxkci;Q{`n})%_ub{3&pqefbIyID=S@A=pDBQ;1@xT2 z)CGEO0MkQo>H?#50W(`y(%++$VPqEI$^*wrTG2ZIX0{%1J}_6(0lfkccK!n3Bw&W5 z{d)r-Gkf3)U>#SyHvnR@&y?>CfV|n~O#TGmci?A9e{}5*t=|GgW}j2?3*cAa2Vgbu z9<Wl<FI~WB6@Z!f{C?n_5u1Gl#eM^x2cD4heue(EyR-_xr82WqfpdXPYDoDF@FMVl zq#tXHFCEeafDM2-!2D8a26uQ3SR(1u26Ge+Z5=?is+r9N<`r1NEMPNWd%%ODLx4RC zT;^+Fv7}d0Lg*5JTf!;8nK6WX9AIW!0keUVfn9ST9Kw7_pQnP*8Gvve{LdW*1wv-F zU2vNtbIQ5}T$}1lNCv>nb^|_>^jF#L#O^RG5;U_x=f^{mZZ2D=%J(Dy%xoXva^Q8~ zj<OUtD7MBOBpo(P(9rjK;E2c_{C2o3#TA(fz*WHUz(2rsz%vyg%#rk9*-iy_SPbkQ z^<5$9nzFHF-x~ukvl+m1z(!#)hj59cm&+Dko9||J9B^f11s*IN-85oM0pL*JmPnb8 zfJKtNT^j|<`kL9+z)iqjQQrkkuf-Gqys+W-d)DrjbXS=|b-tU~*}!?x*yWOz)|o3C z(+Gf>ZRo)XaBw8VJV`5?2sLP|ne7YQ6McUbxU@+Y*%W{WEpGmML_!@S>ARKyxEnkh z&HXXpZt#8G^_l|M3AhdLpe1XwCH+}fpkd=eQRU63kEhZXOZuwrdQAcB0Nftp_)Lab zWmjNbVa;rP;Eia!D}IrrFYC_P6hM&+_|@dajpQxd1Y_j_9;*5w=owtr&XV+Qa_#@C zE$jy@kLLC?*$+W4snu$YEWlSZvkOCpmkDsEq-C|FDH&vDURXIN>NeVIFaXF0LLY=c zsP@TR#KFvF25a+LLDt415Go3VJzae|r4^Xj;Q_#!_XJ=(Lg8QqR|6iaXKhvRO)p>! zZD!`BvSpIIGCZ&qRF|KW<cU|K*7ytv06ZPO5pXm0<_XbD{sL4MrJ0$h&<_LmR)pYH z=7WG6#wHyO5EcTb<+fu9@aQlIX7)~a7<o*R_b;;;e^}jFlD{D|Zb>X40N4WX{QSV2 zR4)LxN-A`R03aLUwSiK1XsmTKK{5aV!Y&~<*fv_j-Qg495s%{XaeEGc-{+OwAr*wA z00IOraV^T_2idvsA>hHw+kl6$KLKy$lyL}^+#v;o<NzW|SP%}Yx^i~n4y^zP5H<%+ z2fVDkO$`ce3HN#aFUj4gmDU=7OxjQ}J`p%7svA~O#+AMw@X)%oAE{ag5P|TB(UY0I zLjh$=U}Ip%0veU8%T-7Y>(d#4Scp*T-xTnY+EY0J{l9?6tGq8XRo=&s1V9dk2SQo% zo%h3UX_XhINdwTC*~j3<#R57t`*8!{K~bk>KW+g0O|kSXF@?Vu%`pxxFw!5UM-HH^ zovk|W6hKu{liF`;0h7A3RrQ)$Kvhzc+HYzBle)82_4*fLEvZn6@o_@{0000<MNUMn GLSTXw9$41^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_action_notification_sync_disabled.png b/app/src/main/res/drawable-xhdpi/ic_action_notification_sync_disabled.png new file mode 100755 index 0000000000000000000000000000000000000000..00e51afb9c718c973d5f96824a12309840087a71 GIT binary patch literal 1388 zcmV-y1(W)TP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000FuNkl<ZcwX(9 zS?H%z7{@<fj6KGMB}*d_289cakS*H<H!euF##l3r3$m4MvW2qm=E8+sP!l1M3tN<; zM3x~jqbwK7PCR;a-s$xI-{t(?bLv08e($;Y)$cv$InVPw&vw2?%=plZ+s_EV=m9g1 zz!(BE?f_#F97A9Xff+|&41pPUfUydUA+RBZfSGL!><Vm_sMl}6x03!%oIht;mIs*G zZopzmFZU^6W?KP^fG;Hd*)-qG76P{cd-ll--|q!pkn~UD{Bi)8**?H^z}~<;z|)fc zs_$TC`vIo{#{*vjmq_}l1AqsE%r2XL1s<35<WR$_b%Q*>%(id^00+T`E3^uDDh9#K zb_Z?*_7C$uEdW5{UPFNx3cx17?ZA<+zLLy26*F`B=KvQ2zNQ2Kt=={Sgh2rKMrP&) zxnXAm8%3MXQP9ke0&WG~_OOxUV9gmJ2XuwNvyyHZVrbi%!2kphJZYU3PPvlR77m93 zUrPF}O_>A$z5-TAT3ZT)EC3=;=naPyg%bd9F|PnOOZquQX5XA_03r~)d>vieaH4o^ z0KmQJec<q#+*Ohu=rb<mdno`806aE#u5CI|#;yTSt$ikxTL-twHS2(@C4H1)WY?Th z09+58(y~!<&8`8k-h0e!7vL^nuV|0el2*<;0A{vzh|5hQWxU+EvYpkTu6zLCPT=)= zlVfHl2T!PE{tg@`$$tlrY!5KABY?Xj4L<fH<;ta0hgkCf=E1-_^{&#)b^sh4?<}ja zT#}d8!J`BK-U}>?G<a0fBcV?yQXMMUW_CVsQM8x0!w(I%KI-BI$uKj&wcP<67717; z$usvv%~Fa2W_BR(L^Sse;0j59r>t+9ljQ+swtaB_>Q3N$oFwV{=+u&%r9LA<7`znC z`vka5(hq%W+rH-l;Md#x0MF9ZSW-WcQsEHfyc_N1w@c3hgFC}q0GtoFKad!eUWYW@ z&nLM%w4IijE${>xeRsnzmGsSgc|cPLoFM7PCWS(oOS(I>tltrMaYG6Lul=3`<5u-N zNgs5aV$xN*1%QJB4^e%7D<r{2hAG7>vO*wa`g$3BSkhx10QjEH{Uu$cV>xDaA#g$T z-~5)r0DzZ3=jN*6{rTl_B?$Aj3<S!Xev_Lt9L&t!-y5OD(OzBwyc7-|B|O0Cu~&i3 zgBH%v-X!Vy+UczT+=X4~|2e@)s)Lz1pWq#*hmemy0M9qS47NVE5vn#ev-)M|v)~2m z%*;>TJ2+>K=1^jjRENMUd3Wg`JSWNd#;lR;0pTQ_^z`d+)epEAycTG%Gl4S#*Wbtq zP7)4gb}n#?Ctpb)W?5g#0|E%k0aq>_?*YygR1Y1kq-bh51fq43B&Wx+M-dMQ0Bj3f z3mn^_RUa#yOtfZO9t0EvAb{Y{T3!*nMQ$3M00bHP0yorNhbCf{CIP1?0Kov~0!|zP zK)77F@k<)kCo@a)0zfU>x9QLq0(*pKwmP>M%bSR3?E|BT2L$7nM%lg;0Djr|9Po#g z&Uc4CL)*TW0>GP`(-NMwQ$1k2aOqhMcu!H3S&G5P0>I4tGIV-qa#9Xq4RBS*>+m)q zfv$<k&W>j3nv|#cF2!;I@UrEZKW2ox_VZiY+9B`x4b75!)0H_~fGe5>K+2JqoD(%m zI{_;tIVF}grV4;iX5H%+<h}<~s7)OJS;yV5cm$v{qSGdC^nhtQvC{gE9#9(5X_Gg4 uz_guMX?;fzD2?c}$s0Xj+D@#rzW)ILk~Ux0$Pj@50000<MNUMnLSTaM1bc=6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xhdpi/ic_plus_sign.png new file mode 100755 index 0000000000000000000000000000000000000000..e94e8136ca4576f6cfaec84a377f84ca42b73f43 GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU`+6IaSW-5dppZ8>#&1>>-`66 zt~_=PioOcvr&)O{8xD$pxXY8tWa*%wd8vi7sZ?27<)Li$#hR^A>&yQA+5dZgit^9Y zlds(wIv7t1PGFfN>@a(QiUOyKyMvI2AH!UxNewC!WEvw?9=y9-EZ-P<@IU_#L*xDB z_Rp9Sc=s^+FMYtDke_xxlHmq}`-7z-HB515-*_|Jk!;+lqQK_Cbc=Zl=PQv5h8pr4 z1e8mT-sZnK^BlWO!*in#vNsr$=O%1@6L6GcXZ8Kt{EQb`7wCQnVEe~3-y!_QjMY(P zD_9-w-|W?VG|lkpre=m6OL?E)_hOo^Z_!o|dri$EB=`Tm-P*ibNKj9O_Y}L2i-X$> zBfIeK?ZVZD=jBx{)yvGiwe-Zt(0lAIdInW_i~_v{uRnJ)t}WN7s!eh*Ikfh?KHHXi z3txQgWW30+-EP0cg{t;N*VWlvl<)ld^HTBye_-taM;*sKTEHM@@O1TaS?83{1OVm( BqV)g( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_notification_sync.png b/app/src/main/res/drawable-xxhdpi/ic_action_notification_sync.png new file mode 100755 index 0000000000000000000000000000000000000000..4017dabe97591ca592e6766d3ba181cdee6726c7 GIT binary patch literal 1943 zcma)-`8S)19>(7{LV_ZyMAJwki6xey(uEd{EfP8QMr#da!mTZ1YcsZYQsYvtrctIe zN+~6=R;jII%;g4^ajW#UC}$e2s+JR7RI9H0AKV|F@AJ!Zo*%yFJm*vB=i{lRfzbc} zK#M_l57_g_{|TwKcmKL^(H;O05e#>iGnXRXh4I$H-41+r?k~vRadStWFG4oaS9JoI zWDiwqhHkuI6qiXZGhmQe45t4=+>;>kcY?_^<cycKi{AM}CV_vhB<o}wFZ<!=hnee{ zl+?uu(NNA<GDj|2?~mokD=1g#`}INE%&qH0UDOvM9ZrG~h^XLfCFD+xffFRYI03St zm>TnOOl3cKO}C)gnMWny?O@kt%yj5*cN+fQ_TVRga;jRfCNs>aA52!a?bHOre3Xr? zsDk<4b);>lHz3-#qz&8@Iuh*i!<*JUVKkse5|vJ<vHU)fe!Mdk43pTL*7eiwZw-zA zLzR0Bnyf@HaZ|_czeCtktV`>_;&@fIlOBju=Pv0WxDVRp0cFSyrquAktJgS#{opO6 zEOe9dBpb2h3*>@Z2c<f|3vk0=?6jkITkIdRO2bv3Q%_@BzL;3&qNRs`a$#8by=1|w zE~4~Nntb=PY}FX1%rgV6#D{d#NlRydmzl_%w|=GcA2#fBnr_E?LY!nyEZEa~-DDY) zTRT~G=TlK*0278)Klzotu3N<h=RH#jJ&lb1-f9h&!0T~Iak0Oa+~#x>p#=boT;c)< z;6H73AKzlkM=urL(N9>M=5(1#uW=hfORlRf(3O7y6g^`-5DSl-&~Ef5^|s%Y8DN_~ z!R`0c`bzzyU>L2*1OyNWV4tg%4wXfj^!DJBoZ@HEdjUDfjg~BX5TYn^SZN`Ul&lxp z4Ava#KAf4K^vf^X`B201$}Fe<3TjHB^_-~C>Q_W=szOId%epQkbC8pPg_cRV;tN$3 zRa#38v|YQs$}SgQ)%H|5*0fZ_PS5%AtLomHVm96aIVxPt7<=5O`wcVVaC4bSO<|rx z;)iNi<yY~h<+Ke6ME7XwPx`9g?;v%(4-(SagMI}(`H$y6E6l51lpS7rme0sYkkjo1 zodpvXjt<#?VYHOQF^9I~Bu*Ve-tu@c@eu{U3jfXSt@Ae?z#jm4UyOLebm8t9uw%}d z)2$Dk2z4$VZ4YF~SA#t7e!q>pgp^Jdk7aoT@T%j^bEbiq83St~@7j7H&rF*AW3r0u zO3cTPxi9Br882@>a|Uir#BJI@(OK-(Jba`f#5kzdN^r0+-O^g%G$?5!$d;7;^%Z+K zs3E%k=ikakNct5tG$k<X_Es&cTre>58t#VLu!o40;+|@SWA&)M(cGgmtM<lqI~v01 zqLRS+a3l<#5_Dn9QP^i#_yZ@y7P?C@RUR9g&i1i|gI=5OtD^Gc&m>uxvuO#x_2pRC z?K~i*=Y29YMhc?FCzJ6k;yE_`#<Q;nquWfIti&hOU7(b;{?BAEo`GA}+8Ib0im*7^ zIbafJ$j}e)KvU-Qq(zte;LC}_<Ndi9qn&h?;a8Z<f_1RK`&{sd@j<FDzPHg7u2>ca z3C{!%oKWvT%r||@%~vI(H18usHQP7$!JN&S?v<{b=Zve8&7N4iWDKsQ@{Jv-<i&ai z+CH6Z^%o~~DAPOKh@WQtghQW?ft3RlPOznweQwTpUWc#BsedGLd;xo_x~liB=|!(u z1DOyJ-`47R!nZHCCF}IO^~uDNv1z(|E#sTdj+-w2#8ZdR34e(df~(GOYB#s$WEhPh zm>1KG!aAfM%AKe>&L5&KT@B=;mIkQINqq<E0z+A5f$uvo>?*WyYbJ5J^#B%QZB^}t zM?k&h3lkFP<*6w9-h^5W5KfGTtRelPT5xOy%OMRr%Ny1Nx<On1o%fQ5Ok0=;9aD}z zX~{DBiS=xy$E5K1ZweKbf2vun@nG`rm9Np)0Z-S63$DAf9LEyHm0CO}=18?!h5p3@ zMs{)ihVVFYz?;SHM5~A1%LI?(uS7?cS;ErGgkb+*?q0PBzVt#nwH)2ZmAng_#=?%? z$AvfV`d_`Wb!pvTZwJF_9^DS*78*PBwsT7Hljo=!W3=FrShk^^;IDc_U690LHonTe ze0WJ#@y!c3tg?lY#sahE&|4~$Upeh9@;e|CzpK@qy3sD7Pn~LiC&u{KuoD>tK2T^$ zT5Pj&WJePU?qZz%J%m+XwLQb%TVBMd#3!vTmR?nCzO~zWxr_g^*D;9}=*@hL1LRYg zEuwjUvdT@2WOg$O_*3{~u}kn=cgj6aY4<PKRHx~VE&CN^hHozZmTk&ly_xa4z@$>V zT8Bg2SA3#ufS)&Ro5U9#*Lja|Lw>tUcMh>sEW~W{p$w_Meg5ji(?d|mc#U37CZCrc zvKczWcQK((l-xplw^6nT(J1xCkCmraa5XQN6NDP8+pcPpDh-0H1{=ZQ_CP<PEI@8H zUiwsgM~9CXcwIX;7@Sc#hJnLco8twne_C$ef(W$PUhh2$ohtnQDWw1lAsNy=sM-;4 b2kwH&+SJ@hcTJ-`-~tQ}ANN+*NdA8TlG;*a literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_notification_sync_disabled.png b/app/src/main/res/drawable-xxhdpi/ic_action_notification_sync_disabled.png new file mode 100755 index 0000000000000000000000000000000000000000..549cf6d8876b9c3e9df0717146cd3380f869ffa3 GIT binary patch literal 2048 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xxhdpi/ic_plus_sign.png new file mode 100755 index 0000000000000000000000000000000000000000..86791667b88fde7e8ec34cc9a75f3a5121c6bca7 GIT binary patch literal 600 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V3PNAaSW-5dppa~i^WlZW%v22 z5B~R9_iO!Ns9*A^HpP+u5nqt0=kawd&sUu>P2z4T<Esx~63*RTqrvb`NW+2AfN{q? z?f?cKhIQYWL>Pn{UhidKJ;3syN}pt@E1WsE%c}FT&;1PaPc~ooj%nY6{cjR>&oAD$ z$s_wM*NTr_{@MzCTf|m0NUi^|h3Sz;b|Zy?-mGu-rd+lAWU;r+_Wc{19>aTGmHUr{ z?^~lQ{NcFwwZOEOe^d3dxh&TEF}_@1V(8E4n((rabxEh#XORGwX>$MTnfzL|<?iO5 zuuC%8=Is-kKEr$cWo!Q2UzA$UD%<*L?|b{Sr5<L*A{SVuM+G}{r5L+2`WCD-WnDt4 zpxlX@)sfLZCzU>U{6AvvF7b_5^y@S&xf*<_8X>@F{N;as-krqr^>Plt6vN=@>gTe~ HDWM4f^tkR1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_notification_sync.png b/app/src/main/res/drawable-xxxhdpi/ic_action_notification_sync.png new file mode 100755 index 0000000000000000000000000000000000000000..bea081263614e56ec9345eac00e3893eb99a09e4 GIT binary patch literal 2779 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_notification_sync_disabled.png b/app/src/main/res/drawable-xxxhdpi/ic_action_notification_sync_disabled.png new file mode 100755 index 0000000000000000000000000000000000000000..d71a99a1a5a5d1a496fe9e073aef42eb494008b0 GIT binary patch literal 2864 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xxxhdpi/ic_plus_sign.png new file mode 100755 index 0000000000000000000000000000000000000000..1958de16cfd97974858f0ca8cf12fa71ebbdb90f GIT binary patch literal 895 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV0QC#aSW-5dpqZBm$0LRYyQv8 zrH}bFew5fXN*~<2<0Eg4UEo2%gIjL}bvPRt&*cj#|M8-D)6An2yxy(7y#4+3lI2I) zZ#A}st^dKnAj8Bcz_5e4;HO#x!vWcb)8>pU4DT3X_HimO6tF+|<jcU=V9hW+pNWIv z4&#m*VF!i>d<UM+W?*6{XVAOPLbg`<sSKA*?s|W+IQe&G?f=P7s<Ypkw{lA{)PBCN zT4}fWp#7vhxoc}h8)U5vd@pZSk)OP0&cyPmPeQZbUgmpxU$b)>15*JrGoyvs5tbXp zUn;qF?A@)_z`5ah^1q1LoC!=3OuCJIjqN-)7~e3IH88WwFn{l9R=psU!MTMc3Mf}6 zS#q`^xFPt!yzKe&S@hnn1M1N++%*5cHJcR*tO|T#&+g^Rm>#p;{+7plwaWQVj-GM) zyXk|ur(OTP3uiu`zFQu^+pzTYH}~&L?@L_jesFkZYn|%PX-od!eH8d^Uvn0N&ekuw zW=|(&Py4+ql0k3h-%f@(pMLl7XX)*ZeZ7Ac1Bb)f=<_zLYwD-WkGjZW!06Ku$+j%B zYSNR#otCv<D&8hPSggXICiZGS_Xp#XVf*<n96xY<?N<H8PS>jHwgw;gFJCa@_JY8> zvKxx+IBsP%|6+FxpIX<jNQ7bW?%iMh7%%H7dj3MyckzGmhGcfugefadoi}I9d*282 zaEM*n_1b(;uzg9LESqpQdEK=vATNRGPQn3TNUagQ9KBE4pK%_O4QmD0hkXssY@oo@ zJ-=(~wQbDckY%uLkUdb%yk2qxFjTWex9Z;SMGE9;4mq4LyWTIjQ~Eo)Y|%cmT&@TR wk7>hJ<_}*3IT`N1wtmXZFo$bElHh;+>v9<rD!zX-0cI=)Pgg&ebxsLQ0GsA<Qvd(} literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/header.png b/app/src/main/res/drawable/header.png new file mode 100644 index 0000000000000000000000000000000000000000..988425eaf35dc46c5934cdcd39d85b13fb3ab551 GIT binary patch literal 7087 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 B*U$g} literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout-sw600dp/activity_message_list.xml b/app/src/main/res/layout-sw600dp/activity_message_list.xml new file mode 100644 index 0000000..6a40fd9 --- /dev/null +++ b/app/src/main/res/layout-sw600dp/activity_message_list.xml @@ -0,0 +1,47 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:gravity="center" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + android:elevation="4dp"/> + + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_below="@id/toolbar" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + android:baselineAligned="false" + android:divider="?android:attr/dividerHorizontal" + android:orientation="horizontal" + android:showDividers="middle" + tools:context=".MessageListActivity"> + + <!-- + This layout is a two-pane layout for the Messages + master/detail flow. + + --> + + <fragment + android:id="@+id/message_list" + android:name="ch.dissem.apps.abit.MessageListFragment" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + tools:layout="@android:layout/list_content"/> + + <FrameLayout + android:id="@+id/message_detail_container" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="3"/> + + </LinearLayout> +</RelativeLayout> diff --git a/app/src/main/res/layout/activity_message_detail.xml b/app/src/main/res/layout/activity_message_detail.xml new file mode 100644 index 0000000..9350427 --- /dev/null +++ b/app/src/main/res/layout/activity_message_detail.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:gravity="center" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" + app:popupTheme="@style/ThemeOverlay.AppCompat.Light" + android:elevation="4dp" /> + + <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_below="@id/toolbar" + android:id="@+id/message_detail_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".MessageDetailActivity" + tools:layout="@android:layout/list_content"/> +</RelativeLayout> diff --git a/app/src/main/res/layout/activity_message_list.xml b/app/src/main/res/layout/activity_message_list.xml new file mode 100644 index 0000000..8072ecf --- /dev/null +++ b/app/src/main/res/layout/activity_message_list.xml @@ -0,0 +1,25 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:gravity="center" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" + app:popupTheme="@style/ThemeOverlay.AppCompat.Light" + android:elevation="4dp" /> + + <fragment xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_below="@id/toolbar" + android:id="@+id/message_list" + android:name="ch.dissem.apps.abit.MessageListFragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".MessageListActivity" + tools:layout="@android:layout/list_content"/> +</RelativeLayout> diff --git a/app/src/main/res/layout/fragment_message_detail.xml b/app/src/main/res/layout/fragment_message_detail.xml new file mode 100644 index 0000000..dce4d36 --- /dev/null +++ b/app/src/main/res/layout/fragment_message_detail.xml @@ -0,0 +1,9 @@ +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/message_detail" + style="?android:attr/textAppearanceLarge" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="16dp" + android:textIsSelectable="true" + tools:context=".MessageDetailFragment"/> diff --git a/app/src/main/res/layout/fragment_message_list.xml b/app/src/main/res/layout/fragment_message_list.xml new file mode 100644 index 0000000..26a3a1b --- /dev/null +++ b/app/src/main/res/layout/fragment_message_list.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ListView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@id/android:list" + + android:layout_alignParentTop="true" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" + android:layout_alignParentBottom="true" /> + + <android.support.design.widget.FloatingActionButton + android:id="@+id/fab_compose_message" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_plus_sign" + app:elevation="8dp" + android:layout_alignParentBottom="true" + android:layout_alignParentEnd="true" + android:layout_alignParentRight="true" + android:layout_margin="16dp"/> +</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/toolbar_layout.xml b/app/src/main/res/layout/toolbar_layout.xml new file mode 100644 index 0000000..160d7a5 --- /dev/null +++ b/app/src/main/res/layout/toolbar_layout.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:gravity="center" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" + app:popupTheme="@style/ThemeOverlay.AppCompat.Light" + android:elevation="4dp" /> + + <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_below="@id/toolbar" + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".MessageListActivity" + tools:layout="@android:layout/list_content"/> +</RelativeLayout> + diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml new file mode 100644 index 0000000..9f35ce1 --- /dev/null +++ b/app/src/main/res/menu/main.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + <item + android:id="@+id/sync_enabled" + app:showAsAction="always" + android:icon="@drawable/ic_action_notification_sync" + android:title="@string/disable_sync"/> + <item + android:id="@+id/sync_disabled" + app:showAsAction="always" + android:icon="@drawable/ic_action_notification_sync_disabled" + android:title="@string/enable_sync"/> +</menu> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cde69bcccec65160d92116f20ffce4fce0b5245c GIT binary patch literal 3418 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c133a0cbd379f5af6dbf1a899a0293ca5eccfad0 GIT binary patch literal 2206 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa42f0e7b91d006d22352c9ff2f134e504e3c1d GIT binary patch literal 4842 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..324e72cdd7480cb983fa1bcc7ce686e51ef87fe7 GIT binary patch literal 7718 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml new file mode 100644 index 0000000..da48d07 --- /dev/null +++ b/app/src/main/res/values-de/strings.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">Abit</string> + <string name="settings">Einstellungen</string> + <string name="wifi_only">Nur WLAN</string> + <string name="wifi_only_summary">Nicht mit Mobilfunknetz verbinden</string> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..9245277 --- /dev/null +++ b/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="AppTheme" parent="AppTheme.Base"> + + <!-- Main theme colors --> + <!-- your app branding color for the app bar --> + <item name="android:colorPrimary">@color/primary</item> + <!-- darker variant for the status bar and contextual app bars --> + <item name="android:colorPrimaryDark">@color/primary_dark</item> + <!-- theme UI controls like checkboxes and text fields --> + <item name="android:colorAccent">@color/accent</item> + + <item name="android:windowContentTransitions">true</item> + <item name="android:windowAllowEnterTransitionOverlap">true</item> + <item name="android:windowAllowReturnTransitionOverlap">true</item> + <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> + <item name="android:windowSharedElementExitTransition">@android:transition/move</item> + + <item name="android:windowDrawsSystemBarBackgrounds">true</item> + <!--<item name="android:statusBarColor">@android:color/transparent</item>--> + + </style> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 0000000..803fa88 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string-array name="connection_modes"> + <item>full</item> + <item>trusted</item> + <item>offline</item> + </string-array> + <string-array name="connection_mode_values"> + <item>A full node, receiving and relaying objects all the time.</item> + <item>Connect to a trusted node from time to time to get new objects.</item> + <item>Don\'t connect to the network.</item> + </string-array> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..42d7392 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Palette generated by Material Palette - materialpalette.com/blue-grey/orange --> +<resources> + <color name="primary">#607D8B</color> + <color name="primary_dark">#455A64</color> + <color name="primary_light">#CFD8DC</color> + <color name="accent">#FF9800</color> + <color name="primary_text">#212121</color> + <color name="secondary_text">#727272</color> + <color name="icons">#FFFFFF</color> + <color name="divider">#B6B6B6</color> +</resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..68e30b8 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,11 @@ +<resources> + <string name="app_name">Abit</string> + <string name="title_message_detail">Message Detail</string> + <string name="disable_sync">Disable Sync</string> + <string name="enable_sync">Enable Sync</string> + <string name="bitmessage_active">Bitmessage active</string> + <string name="wifi_mode">Wi-Fi Connection Mode</string> + <string name="settings">Settings</string> + <string name="wifi_only">Wi-Fi only</string> + <string name="wifi_only_summary">Don\'t connect to the mobile network</string> +</resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..1983c04 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,24 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme.Base" parent="MaterialDrawerTheme.Light.DarkToolbar.TranslucentStatus"> + + <item name="android:activatedBackgroundIndicator">@color/primary_light</item> + + <!-- MaterialDrawer specific values --> + <item name="material_drawer_background">@color/primary_dark</item> + <item name="material_drawer_icons">@color/icons</item> + <item name="material_drawer_primary_icon">@color/icons</item> + <item name="material_drawer_primary_text">@color/icons</item> + <item name="material_drawer_secondary_text">@color/icons</item> + <item name="material_drawer_hint_text">@color/icons</item> + <item name="material_drawer_divider">@color/icons</item> + <item name="material_drawer_selected">@color/primary</item> + <item name="material_drawer_selected_text">@color/icons</item> + <item name="material_drawer_header_selection_text">@color/icons</item> + + </style> + + <style name="AppTheme" parent="AppTheme.Base"/> + +</resources> diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml new file mode 100644 index 0000000..e1f7327 --- /dev/null +++ b/app/src/main/res/xml/preferences.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- + <ListPreference + android:key="wifi_mode" + android:title="@string/wifi_mode" + android:dialogTitle="@string/wifi_mode" + android:entries="@array/connection_modes" + android:entryValues="@array/connection_mode_values"/> + --> + <SwitchPreference + android:key="wifi_only" + android:title="@string/wifi_only" + android:summary="@string/wifi_only_summary" + android:defaultValue="true"/> +</PreferenceScreen> \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..1694c86 --- /dev/null +++ b/build.gradle @@ -0,0 +1,25 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +configurations.all { + // check for updates every build + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.2.3' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + mavenCentral() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..1d3591c --- /dev/null +++ b/gradle.properties @@ -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 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..8c0fb64a8698b08ecc4158d828ca593c4928e9dd GIT binary patch literal 49896 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 N6sQqkUiJO2{|C|0X_No} literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..179dd79 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 10 15:27:10 PDT 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..91a7e26 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/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 + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# 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\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +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"` + + # 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 "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..aec9973 --- /dev/null +++ b/gradlew.bat @@ -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 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':app'