diff --git a/.gitignore b/.gitignore
index 2eb905c..2b75303 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,13 @@
+*.iml
.gradle
/local.properties
-/.idea/*
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
-*.iml
+.externalNativeBuild
diff --git a/.idea/.name b/.idea/.name
deleted file mode 100644
index b5ac966..0000000
--- a/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-SwahiliBox
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index 96cc43e..0000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
deleted file mode 100644
index e7bedf3..0000000
--- a/.idea/copyright/profiles_settings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 0833b17..2996d53 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -3,16 +3,12 @@
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 1a3eaff..37a7509 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,43 +1,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 3858b6e..c00ae32 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,8 +2,8 @@
-
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 94a25f7..35eb1dd 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 53a22c3..0000000
--- a/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# AndroidApp
-SwahiliBox Official Android App
diff --git a/SwahiliBox.iml b/SwahiliBox.iml
deleted file mode 100644
index 15743c1..0000000
--- a/SwahiliBox.iml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/app.iml b/app/app.iml
index 4e20163..140f1c2 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -1,5 +1,5 @@
-
+
@@ -9,93 +9,206 @@
-
-
-
- generateDebugAndroidTestSources
generateDebugSources
-
+
+
-
-
-
+
+
+
-
-
+
+
-
+
+
-
-
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 14c002a..b700f79 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,32 +1,67 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 22
- buildToolsVersion "23.0.1"
-
+ compileSdkVersion 28
defaultConfig {
- applicationId "ke.co.swahilibox.swahilibox"
- minSdkVersion 9
- targetSdkVersion 22
+ applicationId "com.sam.swahilibox"
+ minSdkVersion 21
+ targetSdkVersion 28
versionCode 1
versionName "1.0"
- multiDexEnabled true
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
}
buildTypes {
release {
minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:22.2.1'
- compile 'com.android.support:design:22.2.0'
- compile 'com.parse.bolts:bolts-android:1.+'
- compile fileTree(dir: 'libs', include: 'Parse-*.jar')
- compile 'com.jakewharton:butterknife:6.1.0'
- compile 'com.flaviofaria:kenburnsview:1.0.6'
+ def lifecycle_version = "1.1.1"
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
+ //noinspection GradleCompatible
+ implementation 'com.android.support:appcompat-v7:28.0.0'
+ implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+ implementation 'com.android.support:support-v13:28.0.0'
+ implementation 'android.arch.lifecycle:extensions:1.1.1'
+ implementation 'com.flaviofaria:kenburnsview:1.0.6'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+ // ViewModel and LiveData
+ implementation "android.arch.lifecycle:extensions:$lifecycle_version"
+ //room
+ implementation 'android.arch.persistence.room:runtime:1.1.1'
+ annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
+ implementation 'com.android.support:cardview-v7:28.0.0'
+ implementation 'com.android.support:recyclerview-v7:28.0.0'
+
+ implementation 'com.android.support:support-compat:28.0.0'
+ implementation 'com.android.support:design:28.0.0'
+
+ // Preferences Dependencies
+ implementation 'com.android.support:preference-v7:28.0.0'
+
+ // Firebase dependency
+ implementation 'com.google.firebase:firebase-messaging:17.6.0'
+
+ //firebase
+ implementation 'com.google.firebase:firebase-core:16.0.8'
+ implementation 'com.google.gms:google-services:4.2.0'
+ implementation 'com.evernote:android-job:1.1.8'
+ implementation 'com.firebase:firebase-jobdispatcher:0.5.2'
+
+
+ //auths
+
+ implementation 'com.google.android.gms:play-services-auth:16.0.1'
+ implementation 'com.google.firebase:firebase-auth:16.2.1'
+ // Add the Facebook SDK
+ implementation 'com.facebook.android:facebook-android-sdk:4.20.0'
+ implementation 'com.github.geniushkg:oauthLibGithub:1.0.2'
+ implementation 'com.android.support.constraint:constraint-layout:2.0.0-alpha4'
}
+apply plugin: 'com.google.gms.google-services'
diff --git a/app/google-services.json b/app/google-services.json
new file mode 100644
index 0000000..7e03ed8
--- /dev/null
+++ b/app/google-services.json
@@ -0,0 +1,48 @@
+{
+ "project_info": {
+ "project_number": "209445683946",
+ "firebase_url": "https://swahilibox-14e22.firebaseio.com",
+ "project_id": "swahilibox-14e22",
+ "storage_bucket": "swahilibox-14e22.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:209445683946:android:edca66d9a5cd5036",
+ "android_client_info": {
+ "package_name": "com.sam.swahilibox"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "209445683946-9elarf8jkuslcb8lhes36dnhm7k18iue.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "com.sam.swahilibox",
+ "certificate_hash": "076cd1aa8cd77bd5b26ca5bcba1bc318adaec999"
+ }
+ },
+ {
+ "client_id": "209445683946-fcivn0hgdnkgqg3n5saemfi3jl8nfc0r.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAfXcJwhflXh3axQ79BOUFMeCy0bifrGvM"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "209445683946-fcivn0hgdnkgqg3n5saemfi3jl8nfc0r.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/app/libs/Parse-1.9.1.jar b/app/libs/Parse-1.9.1.jar
deleted file mode 100644
index c121c8d..0000000
Binary files a/app/libs/Parse-1.9.1.jar and /dev/null differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 4ab1947..f1b4245 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -1,17 +1,21 @@
# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /home/japheth/Android/Sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
+# You can control the set of applied configuration files using the
+# proguardFiles setting 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 *;
#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/app/src/androidTest/java/com/sam/swahilibox/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/sam/swahilibox/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..9cf3ba8
--- /dev/null
+++ b/app/src/androidTest/java/com/sam/swahilibox/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.sam.swahilibox;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("com.sam.swahilibox", appContext.getPackageName());
+ }
+}
diff --git a/app/src/androidTest/java/ke/co/swahilibox/swahilibox/ApplicationTest.java b/app/src/androidTest/java/ke/co/swahilibox/swahilibox/ApplicationTest.java
deleted file mode 100644
index 80d2704..0000000
--- a/app/src/androidTest/java/ke/co/swahilibox/swahilibox/ApplicationTest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package ke.co.swahilibox.swahilibox;
-
-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
index f0965de..a4ecd64 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,86 +1,68 @@
+ package="com.sam.swahilibox">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+ android:name=".AboutUs"
+ android:label="@string/title_activity_about_us"
+ android:theme="@style/AppTheme"/>
-
-
-
-
-
-
+ android:name=".Alerts"
+ android:label="@string/title_activity_message"
+ android:theme="@style/AppTheme.NoActionBar">
+
+
-
-
-
-
-
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
-
+
+
-
+
+ android:name="com.facebook.CustomTabActivity"
+ android:exported="true">
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/AboutUs.java b/app/src/main/java/com/sam/swahilibox/AboutUs.java
similarity index 96%
rename from app/src/main/java/ke/co/swahilibox/swahilibox/AboutUs.java
rename to app/src/main/java/com/sam/swahilibox/AboutUs.java
index f826434..f48a3a8 100644
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/AboutUs.java
+++ b/app/src/main/java/com/sam/swahilibox/AboutUs.java
@@ -1,4 +1,4 @@
-package ke.co.swahilibox.swahilibox;
+package com.sam.swahilibox;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
@@ -9,10 +9,11 @@
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
+
public class AboutUs extends AppCompatActivity {
private String url;
- private android.webkit.WebView webView;
+ private WebView webView;
private ProgressBar progressBar;
@Override
diff --git a/app/src/main/java/com/sam/swahilibox/Alerts.java b/app/src/main/java/com/sam/swahilibox/Alerts.java
new file mode 100644
index 0000000..19bd7e4
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/Alerts.java
@@ -0,0 +1,177 @@
+package com.sam.swahilibox;
+
+import android.arch.lifecycle.Observer;
+import android.arch.lifecycle.ViewModelProviders;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.support.v4.view.GravityCompat;
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.view.MenuItem;
+import android.support.design.widget.NavigationView;
+import android.support.v4.widget.DrawerLayout;
+
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.widget.Toast;
+
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.sam.swahilibox.adapters.NotificationAdapter;
+import com.sam.swahilibox.model.Notification;
+import com.sam.swahilibox.viewmodels.NotificationViewModel;
+
+import java.util.List;
+
+public class Alerts extends AppCompatActivity
+ implements NavigationView.OnNavigationItemSelectedListener {
+
+ private NotificationViewModel notificationViewModel;
+ private RecyclerView rv_notification_message;
+ private Intent intent;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_alerts);
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ DrawerLayout drawer = findViewById(R.id.drawer_layout);
+ NavigationView navigationView = findViewById(R.id.nav_view);
+ ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
+ this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
+ drawer.addDrawerListener(toggle);
+ toggle.syncState();
+ navigationView.setNavigationItemSelectedListener(this);
+
+ rv_notification_message = findViewById(R.id.rv_notification_messages);
+ rv_notification_message.setLayoutManager(new LinearLayoutManager(this));
+ rv_notification_message.setHasFixedSize(true);
+
+ rv_notification_message = findViewById(R.id.rv_notification_messages);
+ rv_notification_message.setLayoutManager(new LinearLayoutManager(this));
+ rv_notification_message.setHasFixedSize(true);
+
+ final NotificationAdapter notificationAdapter = new NotificationAdapter();
+ rv_notification_message.setAdapter(notificationAdapter);
+
+ notificationViewModel = ViewModelProviders.of(this).get(NotificationViewModel.class);
+ notificationViewModel.getAllNotes().observe(this,(new Observer>() {
+ @Override
+ public void onChanged(List notifications) {
+ //update recyclerview
+ notificationAdapter.submitList(notifications);
+ }
+ }));
+ subscribeToFcmDealsTopic();
+
+ //swipe to delete a notification message
+ new ItemTouchHelper(new ItemTouchHelper.Callback() {
+ @Override
+ public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
+ return 0;
+ }
+
+ @Override
+ public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
+ return false;
+ }
+
+ @Override
+ public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
+
+ notificationViewModel.delete(notificationAdapter.getNotificationMessageAt(viewHolder.getAdapterPosition()));
+
+ }
+ }).attachToRecyclerView(rv_notification_message);
+
+ }
+
+
+
+ //subscribes to firebase cloud messaging topic one time
+ private void subscribeToFcmDealsTopic(){
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ if (!prefs.getBoolean("firstRun", false)) {
+
+ FirebaseMessaging.getInstance().subscribeToTopic("notifications");
+
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putBoolean("firstRun", true);
+ editor.commit();
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ DrawerLayout drawer = findViewById(R.id.drawer_layout);
+ if (drawer.isDrawerOpen(GravityCompat.START)) {
+ drawer.closeDrawer(GravityCompat.START);
+ } else {
+ super.onBackPressed();
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.alerts, menu);
+ getMenuInflater().inflate(R.menu.menu_item,menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+
+ //noinspection SimplifiableIfStatement
+ if (id == R.id.action_settings) {
+ return true;
+ }
+ if (id == R.id.delete_all_messages){
+ notificationViewModel.deleteAll();
+ Toast.makeText(this, "All Notes Deleted", Toast.LENGTH_SHORT).show();
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ @SuppressWarnings("StatementWithEmptyBody")
+ @Override
+ public boolean onNavigationItemSelected(MenuItem item) {
+ // Handle navigation view item clicks here.
+ int id = item.getItemId();
+
+ if (id == R.id.log_out) {
+ intent = new Intent(this, LogIn.class);
+ startActivity(intent);
+
+ finish();
+ } else if (id == R.id.about_us) {
+ intent = new Intent(this, AboutUs.class);
+ startActivity(intent);
+ Toast.makeText(this, "Loading...", Toast.LENGTH_LONG).show();
+
+ } else if (id == R.id.invite) {
+ intent = new Intent(Intent.ACTION_SEND);
+ intent.setType("text/plain");
+ intent.putExtra(Intent.EXTRA_TEXT, "Hello, you are invited to join SwahiliBox. " +
+ "Check our website http://www.swahilibox.co.ke and download the " +
+ "SwahiliBox App to stay upto date");
+ startActivity(intent);
+
+ }
+
+ DrawerLayout drawer = findViewById(R.id.drawer_layout);
+ drawer.closeDrawer(GravityCompat.START);
+ return true;
+ }
+}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/AppConfig.java b/app/src/main/java/com/sam/swahilibox/AppConfig.java
similarity index 92%
rename from app/src/main/java/ke/co/swahilibox/swahilibox/AppConfig.java
rename to app/src/main/java/com/sam/swahilibox/AppConfig.java
index 964f568..a051f3d 100644
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/AppConfig.java
+++ b/app/src/main/java/com/sam/swahilibox/AppConfig.java
@@ -1,4 +1,4 @@
-package ke.co.swahilibox.swahilibox;
+package com.sam.swahilibox;
/**
* Created by japheth on 11/15/15.
diff --git a/app/src/main/java/com/sam/swahilibox/LogIn.java b/app/src/main/java/com/sam/swahilibox/LogIn.java
new file mode 100644
index 0000000..d122529
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/LogIn.java
@@ -0,0 +1,146 @@
+package com.sam.swahilibox;
+
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+
+import com.facebook.CallbackManager;
+import com.facebook.FacebookCallback;
+import com.facebook.FacebookException;
+import com.facebook.login.LoginManager;
+import com.facebook.login.LoginResult;
+import com.google.android.gms.auth.api.signin.GoogleSignIn;
+import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
+import com.google.android.gms.auth.api.signin.GoogleSignInClient;
+import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
+import com.google.android.gms.common.SignInButton;
+import com.google.android.gms.common.api.ApiException;
+import com.google.android.gms.tasks.Task;
+
+public class LogIn extends AppCompatActivity implements View.OnClickListener {
+
+ SignInButton signInButton;
+ private static final int RC_SIGN_IN = 1;
+ private static final String TAG = "LogIn";
+ private CallbackManager callbackManager;
+
+ private GoogleSignInClient googleSignInClient;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_log_in);
+ signInButton = findViewById(R.id.sign_in_button);
+ //st size to standard
+ signInButton.setSize(signInButton.SIZE_STANDARD);
+ /*// Configure sign-in to request the user's ID, email address, and basic
+ // profile. ID and basic profile are included in DEFAULT_SIGN_IN.*/
+
+ GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
+ .requestEmail()
+ .build();
+
+ // Build a GoogleSignInClient with the options specified by gso.
+ googleSignInClient = GoogleSignIn.getClient(this, gso);
+
+ signInButton.setOnClickListener(this);
+
+ //facebook
+ // Initialize your instance of callbackManager//
+ callbackManager = CallbackManager.Factory.create();
+ // Register your callback//
+ LoginManager.getInstance().registerCallback(callbackManager,
+
+ // If the login attempt is successful, then call onSuccess and pass the LoginResult//
+ new FacebookCallback() {
+ @Override
+ public void onSuccess(LoginResult loginResult) {
+
+ startActivity(new Intent(LogIn.this, Alerts.class));
+ // Print the user’s ID and the Auth Token to Android Studio’s Logcat Monitor//
+
+ Log.d(TAG, "User ID: " +
+ loginResult.getAccessToken().getUserId() + "\n" +
+ "Auth Token: " + loginResult.getAccessToken().getToken());
+ }
+
+ // If the user cancels the login, then call onCancel//
+ @Override
+ public void onCancel() {
+ //return to the same activity
+ finish();
+ }
+
+ // If an error occurs, then call onError//
+ @Override
+ public void onError(FacebookException exception) {
+ Log.e(TAG, "The error occurred at "+exception);
+ }
+ });
+ }
+ private void signIn(){
+ Intent signInIntent = googleSignInClient.getSignInIntent();
+ startActivityForResult(signInIntent,RC_SIGN_IN);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (requestCode == RC_SIGN_IN){
+// The task return from this intent is always completed
+ Task task =
+ GoogleSignIn.getSignedInAccountFromIntent(data);
+ handleSignInEvent(task);
+ }
+ }
+
+ private void handleSignInEvent(Task task) {
+
+ try {
+ GoogleSignInAccount account = task.getResult(ApiException.class);
+
+ //show progress dialog
+ final ProgressDialog progressDialog = new ProgressDialog(LogIn.this);
+ progressDialog.setIndeterminate(true);
+ progressDialog.setMessage("Logging you in...");
+ progressDialog.show();
+
+ // Signed in successfully, show authenticated UI.
+ Intent intent = new Intent(LogIn.this, Alerts.class);
+ startActivity(intent);
+ updateUI(account);
+
+ progressDialog.dismiss();
+
+ } catch (ApiException e) {
+ // The ApiException status code indicates the detailed failure reason.
+ // Please refer to the GoogleSignInStatusCodes class reference for more information.
+ Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
+ updateUI(null);
+ }
+ }
+
+ private void updateUI(GoogleSignInAccount account) {
+ if(account == null){
+ signInButton.setEnabled(true);
+ }else{
+ signInButton.setEnabled(true);
+ //startActivity(new Intent(MainActivity.this,StuffActivity.class));
+
+ }
+
+ }
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.sign_in_button:
+ signIn();
+ break;
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/helper/PrefManager.java b/app/src/main/java/com/sam/swahilibox/PrefManager.java
similarity index 96%
rename from app/src/main/java/ke/co/swahilibox/swahilibox/helper/PrefManager.java
rename to app/src/main/java/com/sam/swahilibox/PrefManager.java
index 5f2d853..0410ba3 100644
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/helper/PrefManager.java
+++ b/app/src/main/java/com/sam/swahilibox/PrefManager.java
@@ -1,4 +1,4 @@
-package ke.co.swahilibox.swahilibox.helper;
+package com.sam.swahilibox;
import android.content.Context;
import android.content.SharedPreferences;
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/Splash.java b/app/src/main/java/com/sam/swahilibox/Splash.java
similarity index 78%
rename from app/src/main/java/ke/co/swahilibox/swahilibox/Splash.java
rename to app/src/main/java/com/sam/swahilibox/Splash.java
index 0ee0d37..551ed4c 100644
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/Splash.java
+++ b/app/src/main/java/com/sam/swahilibox/Splash.java
@@ -1,11 +1,9 @@
-package ke.co.swahilibox.swahilibox;
+package com.sam.swahilibox;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
-import ke.co.swahilibox.swahilibox.helper.PrefManager;
-
public class Splash extends AppCompatActivity {
@@ -15,7 +13,7 @@ protected void onCreate(Bundle savedInstanceState) {
PrefManager manager = new PrefManager(this);
if (manager.isLoggedIn()) {
- Intent intent = new Intent(Splash.this, Main.class);
+ Intent intent = new Intent(Splash.this, Alerts.class);
startActivity(intent);
finish();
} else {
diff --git a/app/src/main/java/com/sam/swahilibox/adapters/NotificationAdapter.java b/app/src/main/java/com/sam/swahilibox/adapters/NotificationAdapter.java
new file mode 100644
index 0000000..1517f00
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/adapters/NotificationAdapter.java
@@ -0,0 +1,88 @@
+package com.sam.swahilibox.adapters;
+
+import android.support.annotation.NonNull;
+import android.support.v7.recyclerview.extensions.ListAdapter;
+import android.support.v7.util.DiffUtil;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.sam.swahilibox.R;
+import com.sam.swahilibox.model.Notification;
+
+public class NotificationAdapter extends ListAdapter {
+ private OnItemclicklistener onItemclicklistener;
+
+ public NotificationAdapter() {
+ super(DIFF_CALLBACK);
+ }
+
+ //more efficient than notifyDatasetChanged
+ private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() {
+ @Override
+ public boolean areItemsTheSame(@NonNull Notification notification, @NonNull Notification t1) {
+ return notification.getId() == t1.getId();
+ }
+
+ @Override
+ public boolean areContentsTheSame(@NonNull Notification notification, @NonNull Notification t1) {
+ return notification.getTitle().equals(t1.getTitle())&&
+ notification.getMessage().equals(t1.getMessage())&&
+ notification.getDate().equals(t1.getDate());
+ }
+ };
+
+ @NonNull
+ @Override
+ public NoteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.notify_item, parent, false);
+
+ return new NoteHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull NoteHolder holder, int position) {
+ Notification notification = getItem(position);
+ holder.tv_title.setText(notification.getTitle());
+ holder.tv_date.setText(String.valueOf(notification.getDate()));
+ holder.tv_message.setText(notification.getMessage());
+ }
+
+
+ public Notification getNotificationMessageAt(int position) {
+ return getItem(position);
+ }
+
+ class NoteHolder extends RecyclerView.ViewHolder {
+ private TextView tv_title;
+ private TextView tv_date;
+ private TextView tv_message;
+
+ public NoteHolder(@NonNull View itemView) {
+ super(itemView);
+ tv_title = itemView.findViewById(R.id.tv_title);
+ tv_message = itemView.findViewById(R.id.tv_message);
+ tv_date = itemView.findViewById(R.id.tv_date);
+
+ itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ int position = getAdapterPosition();
+ if (onItemclicklistener != null && position != RecyclerView.NO_POSITION) {
+ onItemclicklistener.onItemClick(getItem(position));
+ }
+ }
+ });
+ }
+ }
+ public interface OnItemclicklistener {
+ void onItemClick(Notification notification);
+ }
+ //future objectives app version2.0
+ public void setOnItemclicklistener(OnItemclicklistener onItemclicklistener) {
+ this.onItemclicklistener = onItemclicklistener;
+ }
+}
+
diff --git a/app/src/main/java/com/sam/swahilibox/fcm/FirebaseInstanceIdService.java b/app/src/main/java/com/sam/swahilibox/fcm/FirebaseInstanceIdService.java
new file mode 100644
index 0000000..1b4604d
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/fcm/FirebaseInstanceIdService.java
@@ -0,0 +1,21 @@
+package com.sam.swahilibox.fcm;
+
+import android.util.Log;
+
+import com.google.firebase.iid.FirebaseInstanceId;
+
+public class FirebaseInstanceIdService extends com.google.firebase.iid.FirebaseInstanceIdService {
+
+ private static final String TAG = "FirebaseInstanceIdServi";
+
+ @Override
+ public void onTokenRefresh() {
+
+
+ String refreshToken = FirebaseInstanceId.getInstance().getToken();
+
+ //creates a log that will enable us to get a token
+ Log.d(TAG,"Our token is: "+refreshToken);
+
+ }
+}
diff --git a/app/src/main/java/com/sam/swahilibox/fcm/FirebaseMessageService.java b/app/src/main/java/com/sam/swahilibox/fcm/FirebaseMessageService.java
new file mode 100644
index 0000000..ab1b72e
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/fcm/FirebaseMessageService.java
@@ -0,0 +1,78 @@
+package com.sam.swahilibox.fcm;
+
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+
+import android.os.Bundle;
+import android.support.v4.app.NotificationCompat;
+import android.util.Log;
+
+import com.firebase.jobdispatcher.FirebaseJobDispatcher;
+import com.firebase.jobdispatcher.GooglePlayDriver;
+import com.firebase.jobdispatcher.Job;
+import com.google.firebase.messaging.FirebaseMessagingService;
+import com.google.firebase.messaging.RemoteMessage;
+import com.sam.swahilibox.Alerts;
+import com.sam.swahilibox.R;
+
+
+import java.util.Map;
+
+public class FirebaseMessageService extends FirebaseMessagingService {
+ private static final String TAG = "FirebaseMessageService";
+
+
+
+ @Override
+ public void onMessageReceived(RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Log.d(TAG, "Received message " + remoteMessage.getFrom());
+
+ if (remoteMessage.getData().size() > 0) {
+ Log.d(TAG, "Message data " + remoteMessage.getData());
+ scheduleJob(remoteMessage.getData());
+ }
+ if (remoteMessage.getNotification() != null) {
+ Log.d(TAG, "Message Notification "
+ + remoteMessage.getNotification().getBody());
+ sendNotification(remoteMessage.getNotification());
+ }
+ }
+ private void scheduleJob(Map data) {
+ Bundle bundle = new Bundle();
+ for (Map.Entry entry : data.entrySet()) {
+ bundle.putString(entry.getKey(), entry.getValue());
+ }
+
+ FirebaseJobDispatcher dispatcher =
+ new FirebaseJobDispatcher(new GooglePlayDriver(this));
+ Job myJob = dispatcher.newJobBuilder()
+ .setService(NotificationJobService.class)
+ .setTag("notifications")
+ .setExtras(bundle)
+ .build();
+ dispatcher.schedule(myJob);
+ }
+
+ private void sendNotification(RemoteMessage.Notification notification) {
+ Intent intent = new Intent(this, Alerts.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
+ PendingIntent.FLAG_ONE_SHOT);
+
+ NotificationCompat.Builder notificationBuilder =
+ new NotificationCompat.Builder(this, "fcm-channel")
+ .setSmallIcon(R.drawable.swahilibox_splash)
+ .setContentTitle(notification.getTitle())
+ .setContentText(notification.getBody())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+
+ NotificationManager notificationManager =
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+}
diff --git a/app/src/main/java/com/sam/swahilibox/fcm/NotificationJobService.java b/app/src/main/java/com/sam/swahilibox/fcm/NotificationJobService.java
new file mode 100644
index 0000000..c65c309
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/fcm/NotificationJobService.java
@@ -0,0 +1,57 @@
+package com.sam.swahilibox.fcm;
+
+import android.os.Bundle;
+import android.util.Log;
+
+import com.firebase.jobdispatcher.JobParameters;
+import com.firebase.jobdispatcher.JobService;
+import com.sam.swahilibox.model.Notification;
+import com.sam.swahilibox.model.NotificationDao;
+import com.sam.swahilibox.repositories.NotificationRepository;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+public class NotificationJobService extends JobService {
+ private static final String TAG = "NotificationJobService";
+ private final Executor executor = Executors.newFixedThreadPool(2);
+ private NotificationDao notificationDao = NotificationRepository.getNotificationDatabase(this).notificationDao();
+
+ @Override
+ public boolean onStartJob(JobParameters job) {
+ Log.d(TAG, "updating ROOM database with latest data");
+
+ addNotificationDataToSQLiteDatabase(job.getExtras());
+ return false;
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters job) {
+ return false;
+ }
+
+ //add data to sqlite database using room
+ //should be done on seperate thread
+ private void addNotificationDataToSQLiteDatabase(Bundle bundle) {
+
+ final Notification notification = getNotificationObjectFromBundle(bundle);
+ executor.execute(new Runnable() {
+ @Override
+ public void run() {
+ long rec = notificationDao.insert(notification);
+ Log.d(TAG, "added record to db " + rec);
+ }
+ });
+
+ }
+
+ private Notification getNotificationObjectFromBundle(Bundle bundle) {
+ Notification notification1 = new Notification();
+ notification1.setTitle(bundle.getString("title"));
+ notification1.setMessage(bundle.getString("message"));
+ notification1.setDate(bundle.getString("date"));
+
+ return notification1;
+
+ }
+}
diff --git a/app/src/main/java/com/sam/swahilibox/model/Notification.java b/app/src/main/java/com/sam/swahilibox/model/Notification.java
new file mode 100644
index 0000000..03665d2
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/model/Notification.java
@@ -0,0 +1,59 @@
+package com.sam.swahilibox.model;
+
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.PrimaryKey;
+
+@Entity(tableName = "table_notification")
+public class Notification {
+
+ @PrimaryKey(autoGenerate = true)
+ private int id;
+
+ private String title;
+
+ private String message;
+
+ private String date;
+
+ public Notification(String title, String message,String date) {
+ this.title = title;
+ this.message = message;
+ this.date = date;
+ }
+
+ public Notification() {
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getDate() {
+ return date;
+ }
+}
+
diff --git a/app/src/main/java/com/sam/swahilibox/model/NotificationDao.java b/app/src/main/java/com/sam/swahilibox/model/NotificationDao.java
new file mode 100644
index 0000000..330136d
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/model/NotificationDao.java
@@ -0,0 +1,29 @@
+package com.sam.swahilibox.model;
+
+import android.arch.lifecycle.LiveData;
+import android.arch.persistence.room.Dao;
+import android.arch.persistence.room.Delete;
+import android.arch.persistence.room.Insert;
+import android.arch.persistence.room.Query;
+import android.arch.persistence.room.Update;
+
+import java.util.List;
+
+@Dao
+public interface NotificationDao {
+
+ @Insert
+ long insert(Notification notification);
+
+ @Update
+ void update(Notification notification);
+
+ @Delete
+ void delete(Notification notification);
+
+ @Query("DELETE FROM table_notification")
+ void deleteAllNotificationMessages();
+
+ @Query("SELECT * FROM table_notification Order By date DESC")
+ LiveData> getNotifications();
+}
diff --git a/app/src/main/java/com/sam/swahilibox/model/NotificationDatabase.java b/app/src/main/java/com/sam/swahilibox/model/NotificationDatabase.java
new file mode 100644
index 0000000..5245508
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/model/NotificationDatabase.java
@@ -0,0 +1,16 @@
+package com.sam.swahilibox.model;
+
+import android.arch.persistence.db.SupportSQLiteDatabase;
+import android.arch.persistence.room.Database;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.RoomDatabase;
+import android.content.Context;
+import android.os.AsyncTask;
+import android.support.annotation.NonNull;
+
+@Database(entities = Notification.class,version = 1)
+public abstract class NotificationDatabase extends RoomDatabase {
+
+ public abstract NotificationDao notificationDao();
+
+}
diff --git a/app/src/main/java/com/sam/swahilibox/repositories/NotificationRepository.java b/app/src/main/java/com/sam/swahilibox/repositories/NotificationRepository.java
new file mode 100644
index 0000000..8610b24
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/repositories/NotificationRepository.java
@@ -0,0 +1,60 @@
+package com.sam.swahilibox.repositories;
+
+import android.arch.lifecycle.LiveData;
+import android.arch.persistence.room.Room;
+import android.content.Context;
+import android.os.AsyncTask;
+
+import com.sam.swahilibox.model.Notification;
+import com.sam.swahilibox.model.NotificationDao;
+import com.sam.swahilibox.model.NotificationDatabase;
+
+import java.util.List;
+
+public class NotificationRepository {
+
+ private static NotificationDatabase notificationsDatabase;
+ private NotificationDao notificationDAO;
+ private static final Object LOCK = new Object();
+
+ public synchronized static NotificationDatabase getNotificationDatabase(Context context){
+ if(notificationsDatabase == null) {
+ synchronized (LOCK) {
+ if (notificationsDatabase == null) {
+ notificationsDatabase = Room.databaseBuilder(context,
+ NotificationDatabase.class, "notifications db").build();
+ }
+ }
+ }
+ return notificationsDatabase;
+ }
+ public LiveData> getNotifications(Context context) {
+ if (notificationDAO == null) {
+ notificationDAO = NotificationRepository.getNotificationDatabase(context).notificationDao();
+ }
+ return notificationDAO.getNotifications();
+ }
+ public void deleteMessage(Notification notification){
+ new DeleteAsyncTask(notificationDAO).execute(notification);
+ }
+ public void DeleteAlLMessages(){new DeleteAllNotificationMessages(notificationDAO).execute();}
+ //should be performed on background thread
+ private static class DeleteAsyncTask extends AsyncTask{
+ NotificationDao notificationDao;
+ public DeleteAsyncTask(NotificationDao notificationDao){this.notificationDao = notificationDao;}
+ @Override
+ protected Void doInBackground(Notification... notifications) {
+ notificationDao.delete(notifications[0]);
+ return null;
+ }
+ }
+ private static class DeleteAllNotificationMessages extends AsyncTask{
+ NotificationDao notificationDao;
+ public DeleteAllNotificationMessages(NotificationDao notificationDao){this.notificationDao = notificationDao;}
+ @Override
+ protected Void doInBackground(Void... voids) {
+ notificationDao.deleteAllNotificationMessages();
+ return null;
+ }
+ }
+}
diff --git a/app/src/main/java/com/sam/swahilibox/viewmodels/NotificationViewModel.java b/app/src/main/java/com/sam/swahilibox/viewmodels/NotificationViewModel.java
new file mode 100644
index 0000000..a33f532
--- /dev/null
+++ b/app/src/main/java/com/sam/swahilibox/viewmodels/NotificationViewModel.java
@@ -0,0 +1,28 @@
+package com.sam.swahilibox.viewmodels;
+
+import android.app.Application;
+import android.arch.lifecycle.AndroidViewModel;
+import android.arch.lifecycle.LiveData;
+import android.support.annotation.NonNull;
+
+import com.sam.swahilibox.model.Notification;
+import com.sam.swahilibox.repositories.NotificationRepository;
+
+import java.util.List;
+
+public class NotificationViewModel extends AndroidViewModel {
+ private NotificationRepository repository;
+ private LiveData> allNotes;
+
+ public NotificationViewModel(@NonNull Application application) {
+ super(application);
+ repository = new NotificationRepository();
+ allNotes = repository.getNotifications(application);
+ }
+ public LiveData> getAllNotes(){
+ return allNotes;
+ }
+ public void delete(Notification notification){repository.deleteMessage(notification);}
+ public void deleteAll(){repository.DeleteAlLMessages();}
+}
+
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/LogIn.java b/app/src/main/java/ke/co/swahilibox/swahilibox/LogIn.java
deleted file mode 100644
index 7ee17fd..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/LogIn.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package ke.co.swahilibox.swahilibox;
-
-import android.app.ProgressDialog;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.parse.LogInCallback;
-import com.parse.ParseUser;
-
-import butterknife.ButterKnife;
-import butterknife.InjectView;
-import ke.co.swahilibox.swahilibox.helper.PrefManager;
-
-public class LogIn extends AppCompatActivity {
-
- private static final String TAG = LogIn.class.getSimpleName();
- private static final int REQUEST_SIGNUP = 0;
-
- @InjectView(R.id.input_username)
- EditText username;
- @InjectView(R.id.input_password)
- EditText password;
- @InjectView(R.id.btn_login)
- Button logIn;
- @InjectView(R.id.link_signup)
- TextView signUp;
-
- PrefManager pref = null;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_log_in);
- ButterKnife.inject(this);
- pref = new PrefManager(this);
- logIn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- logIn();
- }
- });
-
- signUp.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- Intent intent = new Intent(getApplicationContext(), SignUp.class);
- startActivity(intent);
- overridePendingTransition(R.transition.slide_in_right, R.transition.slide_out_left);
- finish();
- }
- });
- }
-
- public void logIn() {
- if (!validate()) {
- onLogInFailed();
- return;
- }
-
- logIn.setEnabled(false);
-
- final ProgressDialog progressDialog = new ProgressDialog(LogIn.this);
- progressDialog.setIndeterminate(true);
- progressDialog.setMessage("Logging you in...");
- progressDialog.show();
-
- final String userName = username.getText().toString();
- String _pass = password.getText().toString();
-
- ParseUser.logInInBackground(userName, _pass, new LogInCallback() {
- @Override
- public void done(ParseUser user, com.parse.ParseException e) {
- //If user exists and authenticated send them to main
- if (user != null) {
- pref.createLoginSession(userName);
- Intent intent = new Intent(LogIn.this, Main.class);
- startActivity(intent);
- overridePendingTransition(R.transition.push_up_in, R.transition.push_up_out);
- finish();
- } else {
- onLogInFailed();
- }
-
- progressDialog.dismiss();
-
- }
- });
-
- }
-
- @Override
- public void onBackPressed() {
- moveTaskToBack(false);
- }
-
- public void onLoginSuccess() {
- logIn.setEnabled(true);
- finish();
- }
-
- public void onLogInFailed() {
- Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show();
- logIn.setEnabled(true);
- }
-
- public boolean validate() {
- boolean valid = true;
-
- String userName = this.username.getText().toString();
- String _password = this.password.getText().toString();
-
-
- if (_password.isEmpty() || password.length() < 4 || password.length() > 10) {
- password.setError("between 4 and 10 alphanumeric characters");
- valid = false;
- } else {
-
- password.setError(null);
- }
-
- return valid;
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/Main.java b/app/src/main/java/ke/co/swahilibox/swahilibox/Main.java
deleted file mode 100644
index 2efdf16..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/Main.java
+++ /dev/null
@@ -1,297 +0,0 @@
-package ke.co.swahilibox.swahilibox;
-
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.res.Configuration;
-import android.os.Build;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.support.design.widget.NavigationView;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
-import android.util.Log;
-import android.view.ActionMode;
-import android.view.ContextMenu;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.AbsListView;
-import android.widget.AdapterView;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.parse.ParseUser;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import ke.co.swahilibox.swahilibox.adapter.MessageAdapter;
-import ke.co.swahilibox.swahilibox.database.SwahiliBoxDatasource;
-import ke.co.swahilibox.swahilibox.helper.ParseUtil;
-import ke.co.swahilibox.swahilibox.helper.PrefManager;
-import ke.co.swahilibox.swahilibox.model.Message;
-
-
-/**
- * Created by japheth on 11/15/15.
- */
-public class Main extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
- private static String TAG = Main.class.getSimpleName();
-
- private static final String SELECTED_ITEM_ID = "selected_item_id";
- private static final String FIRST_TIME = "first_time";
- private Toolbar mToolbar;
- private NavigationView mDrawer;
- private DrawerLayout mDrawerLayout;
- private ActionBarDrawerToggle mDrawerToggle;
- private int mSelectedId;
- private boolean mUserSawDrawer = false;
- private ListView listView;
- private MessageAdapter adapter;
- private List messages;
- private PrefManager pref;
- private TextView user_name;
- private SwahiliBoxDatasource dataSource;
- private ActionMode.Callback mActionModeCallback;
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- pref = new PrefManager(this);
- dataSource = new SwahiliBoxDatasource(this);
- dataSource.open();
-
- mToolbar = (Toolbar) findViewById(R.id.app_bar);
- setSupportActionBar(mToolbar);
-
- user_name = (TextView) findViewById(R.id.username);
- mDrawer = (NavigationView) findViewById(R.id.main_drawer);
- mDrawer.setNavigationItemSelectedListener(this);
- mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
-
- listView = (ListView) findViewById(R.id.list_view);
- this.listView.setEmptyView(findViewById(R.id.empty)); //if list view is empty dispay the empty textview
- messages = new ArrayList<>();
-
- updateDisplay();
-
- Intent intent = getIntent();
-
- mDrawerToggle = new ActionBarDrawerToggle(this,
- mDrawerLayout,
- mToolbar,
- R.string.drawer_open,
- R.string.drawer_close);
- mDrawerLayout.setDrawerListener(mDrawerToggle);
- mDrawerToggle.syncState();
- if (!didUserSeeDrawer()) {
- showDrawer();
- markDrawerSeen();
- } else {
- hideDrawer();
- }
- mSelectedId = savedInstanceState == null ? 0 : savedInstanceState.getInt(SELECTED_ITEM_ID);
- navigate(mSelectedId);
-
- ParseUser user = ParseUser.getCurrentUser();
- String email = user.getEmail();
- user_name.setText(user.getUsername());
-
- if (email != null) {
- Log.i(TAG, "Parse user email" + user.getEmail());
- ParseUtil.subscribeWithEmail(user.getEmail());
- } else {
- Log.i(TAG, "Email is null. Not subscribing to parse!");
- }
-
-
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
- //use floating context menu on Froyo and Ginger bread
- registerForContextMenu(listView);
- } else {
- //use contextual action bar on Honeycomb and higher
- listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
- listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
- @Override
- public void onItemCheckedStateChanged(ActionMode actionMode, int i, long l, boolean b) {
-
- }
-
- @Override
- public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
- //inflate the delete_message menu resource file
- MenuInflater inflater = actionMode.getMenuInflater();
- inflater.inflate(R.menu.message_list_item_context, menu);
- return true;
- }
-
- @Override
- public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
- return false;
- }
-
- @Override
- public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
- //action taken when a list item is long pressed
- switch (menuItem.getItemId()) {
- case R.id.delete_message:
- MessageAdapter adapter = (MessageAdapter) listView.getAdapter();
-
- //loop through all items
- for (int i = adapter.getCount() - 1; i >= 0; i--) {
- //check if item is checked
- if (listView.isItemChecked(i)) {
- //delete selected item
- dataSource.deleteMessage(adapter.getItem(i));
- }
-
- }
- actionMode.finish();
- return true;
-
- default:
- return false;
- }
- }
-
- @Override
- public void onDestroyActionMode(ActionMode actionMode) {
- //update the display
- messages = dataSource.findAll();
- updateDisplay();
- }
- });
- }
-
-
- }
-
- private boolean didUserSeeDrawer() {
- SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- mUserSawDrawer = sharedPreferences.getBoolean(FIRST_TIME, false);
- return mUserSawDrawer;
- }
-
- private void markDrawerSeen() {
- SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
- mUserSawDrawer = true;
- sharedPreferences.edit().putBoolean(FIRST_TIME, mUserSawDrawer).apply();
- }
-
- private void showDrawer() {
- mDrawerLayout.openDrawer(GravityCompat.START);
- }
-
- private void hideDrawer() {
- mDrawerLayout.closeDrawer(GravityCompat.START);
- }
-
- //navigate the navigation view menu
- private void navigate(int mSelectedId) {
- Intent intent = null;
-
- if (mSelectedId != 0) {
- switch (mSelectedId) {
- case R.id.log_out:
- pref.logOut();
- intent = new Intent(this, LogIn.class);
- startActivity(intent);
- overridePendingTransition(R.transition.push_down_in, R.transition.push_down_out);
- finish();
- break;
- case R.id.about_us:
- intent = new Intent(this, AboutUs.class);
- startActivity(intent);
- Toast.makeText(this, "Loading...", Toast.LENGTH_LONG).show();
- break;
- case R.id.invite:
- intent = new Intent(Intent.ACTION_SEND);
- intent.setType("text/plain");
- intent.putExtra(Intent.EXTRA_TEXT, "Hello, you are invited to join SwahiliBox. " +
- "Check our website http://www.swahilibox.co.ke and download the " +
- "SwahiliBox App to stay upto date");
- startActivity(intent);
- break;
- }
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- mDrawerToggle.onConfigurationChanged(newConfig);
- }
-
- @Override
- public boolean onNavigationItemSelected(MenuItem menuItem) {
-
- menuItem.setChecked(true);
- mSelectedId = menuItem.getItemId();
-
- navigate(mSelectedId);
- return true;
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(SELECTED_ITEM_ID, mSelectedId);
- }
-
- @Override
- public void onBackPressed() {
- if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
- mDrawerLayout.closeDrawer(GravityCompat.START);
- } else {
- super.onBackPressed();
- }
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
- getMenuInflater().inflate(R.menu.message_list_item_context, menu);
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
- int position = info.position;
- Message message = (Message) listView.getAdapter().getItem(position);
- switch (item.getItemId()) {
- case R.id.delete_message:
- dataSource.deleteMessage(message);
- updateDisplay();
- return true;
- }
- return super.onContextItemSelected(item);
- }
-
- public void updateDisplay() {
- //get list of messages from the database and set
- //the adapter
- messages = dataSource.findAll();
- adapter = new MessageAdapter(this, messages);
- listView.setAdapter(adapter);
-
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- dataSource.open();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- dataSource.close();
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/SignUp.java b/app/src/main/java/ke/co/swahilibox/swahilibox/SignUp.java
deleted file mode 100644
index 624ee1a..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/SignUp.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package ke.co.swahilibox.swahilibox;
-
-import android.app.ProgressDialog;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.parse.ParseUser;
-import com.parse.SignUpCallback;
-
-import butterknife.ButterKnife;
-import butterknife.InjectView;
-import ke.co.swahilibox.swahilibox.helper.PrefManager;
-
-public class SignUp extends AppCompatActivity {
-
- private static final String TAG = "SignupActivity";
-
- @InjectView(R.id.input_name)
- EditText name;
- @InjectView(R.id.input_email)
- EditText email;
- @InjectView(R.id.input_password)
- EditText password;
- @InjectView(R.id.btn_signup)
- Button signUp;
- @InjectView(R.id.link_login)
- TextView logInLink;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_sign_up);
- ButterKnife.inject(this);
-
- signUp.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- signup();
- }
- });
-
- logInLink.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(getApplicationContext(), LogIn.class);
- startActivity(intent);
- overridePendingTransition(R.transition.slide_in_left, R.transition.slide_out_right);
- }
- });
- }
-
- public void signup() {
-
- if (!validate()) {
- onSignupFailed();
- return;
- }
-
- signUp.setEnabled(false);
-
- final ProgressDialog progressDialog = new ProgressDialog(SignUp.this);
- progressDialog.setIndeterminate(true);
- progressDialog.setMessage("Creating Account...");
- progressDialog.show();
-
- String name = this.name.getText().toString();
- final String email = this.email.getText().toString();
- String password = this.password.getText().toString();
-
- ParseUser user = new ParseUser();
- user.setEmail(email);
- user.setUsername(name);
- user.setPassword(password);
- user.signUpInBackground(new SignUpCallback() {
-
-
- @Override
- public void done(com.parse.ParseException e) {
- if (e == null) {
- new PrefManager(SignUp.this).createLoginSession(email);
- onSignupSuccess();
- } else {
- onSignupFailed();
- }
-
- progressDialog.dismiss();
- }
- });
-
- }
-
-
- public void onSignupSuccess() {
- signUp.setEnabled(true);
- Intent intent = new Intent(SignUp.this, Splash.class);
- startActivity(intent);
- overridePendingTransition(R.transition.slide_in_right, R.transition.slide_out_left);
- finish();
- }
-
- public void onSignupFailed() {
- Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show();
-
- signUp.setEnabled(true);
- }
-
- public boolean validate() {
- boolean valid = true;
-
- String name = this.name.getText().toString();
- String email = this.email.getText().toString();
- String password = this.password.getText().toString();
-
- if (name.isEmpty() || name.length() < 3) {
- this.name.setError("at least 3 characters");
- valid = false;
- } else {
- this.name.setError(null);
- }
-
- if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
- this.email.setError("enter a valid email address");
- valid = false;
- } else {
- this.email.setError(null);
- }
-
- if (password.isEmpty() || password.length() < 4 || password.length() > 10) {
- this.password.setError("between 4 and 10 alphanumeric characters");
- valid = false;
- } else {
- this.password.setError(null);
- }
-
- return valid;
- }
-}
-
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/SwahiliBoxParse.java b/app/src/main/java/ke/co/swahilibox/swahilibox/SwahiliBoxParse.java
deleted file mode 100644
index 81c6a5c..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/SwahiliBoxParse.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package ke.co.swahilibox.swahilibox;
-
-import android.app.Application;
-import android.util.Log;
-
-import com.parse.ParseACL;
-import com.parse.ParseUser;
-
-import ke.co.swahilibox.swahilibox.helper.ParseUtil;
-
-/**
- * Created by japheth on 11/16/15.
- */
-public class SwahiliBoxParse extends Application {
- /**
- * This is an application class, executed on app launch
- * Parse is initialized here
- */
- private static SwahiliBoxParse mInstance;
-
- public static synchronized SwahiliBoxParse getInstance() {
- return mInstance;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- Log.i("SwahiliBoxParse", "SwahiliBoxParse on create");
-
- mInstance = this;
- //register with parse
- ParseUtil.registerParse(getApplicationContext());
- ParseUser.enableAutomaticUser();
- ParseACL defaultAcl = new ParseACL();
-
- defaultAcl.setPublicReadAccess(true);
- ParseACL.setDefaultACL(defaultAcl, true);
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/adapter/MessageAdapter.java b/app/src/main/java/ke/co/swahilibox/swahilibox/adapter/MessageAdapter.java
deleted file mode 100644
index 0e4cb31..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/adapter/MessageAdapter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package ke.co.swahilibox.swahilibox.adapter;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
-
-import java.util.List;
-
-import ke.co.swahilibox.swahilibox.R;
-import ke.co.swahilibox.swahilibox.model.Message;
-
-/**
- * Created by japheth on 11/17/15.
- */
-public class MessageAdapter extends ArrayAdapter {
-
- private static final String TAG = MessageAdapter.class.getSimpleName();
- Context context;
- List messages;
-
- public MessageAdapter(Context context, List messageList) {
- super(context, 0, messageList);
- this.context = context;
- messages = messageList;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View view = View.inflate(context, R.layout.list_item, null);
-
- Message message = getItem(position);
- TextView mess = (TextView) view.findViewById(R.id.message);
- TextView title = (TextView) view.findViewById(R.id.title);
-
- title.setText(message.getTitle());
- mess.setText(message.getMessage());
-
- return view;
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/database/SwahiliBoxDBOpenHelper.java b/app/src/main/java/ke/co/swahilibox/swahilibox/database/SwahiliBoxDBOpenHelper.java
deleted file mode 100644
index 4f2a739..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/database/SwahiliBoxDBOpenHelper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package ke.co.swahilibox.swahilibox.database;
-
-import android.content.Context;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.util.Log;
-
-/**
- * Created by japheth on 11/20/15.
- */
-public class SwahiliBoxDBOpenHelper extends SQLiteOpenHelper {
-
- private static final String TAG = SwahiliBoxDBOpenHelper.class.getSimpleName();
-
- private static final String DATABASE_NAME = "SwahiliBox";
- private static final int DATABASE_VERSION = 1;
-
- public static final String TABLE_NOTIFICATIONS = "notifications";
- public static final String COLUMN_NOTIFICATION_ID = "notification_id";
- public static final String COLUMN_NOTIFICATION_TITLE = "notification_title";
- public static final String COLUMN_NOTIFICATION_MESSAGE = "notification_message";
-
- public static final String TABLE_CREATE =
- "CREATE TABLE " + TABLE_NOTIFICATIONS + " (" +
- COLUMN_NOTIFICATION_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
- COLUMN_NOTIFICATION_TITLE + " TEXT, " +
- COLUMN_NOTIFICATION_MESSAGE + " TEXT " + ")";
-
- public SwahiliBoxDBOpenHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- }
-
- @Override
- public void onCreate(SQLiteDatabase sqLiteDatabase) {
- sqLiteDatabase.execSQL(TABLE_CREATE);
- Log.i(TAG, "Database created");
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
- sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTIFICATIONS);
- onCreate(sqLiteDatabase);
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/database/SwahiliBoxDatasource.java b/app/src/main/java/ke/co/swahilibox/swahilibox/database/SwahiliBoxDatasource.java
deleted file mode 100644
index e54a0f7..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/database/SwahiliBoxDatasource.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package ke.co.swahilibox.swahilibox.database;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import ke.co.swahilibox.swahilibox.model.Message;
-
-/**
- * Created by japheth on 11/20/15.
- */
-public class SwahiliBoxDatasource {
- /**
- * All datatbase base interactions are through this class
- */
-
- public static final String TAG = SwahiliBoxDatasource.class.getSimpleName();
-
- SQLiteOpenHelper dbhelper;
- SQLiteDatabase database;
-
- private static final String[] allColumns = {
- SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_ID,
- SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_TITLE,
- SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_MESSAGE};
-
- public SwahiliBoxDatasource(Context context) {
- dbhelper = new SwahiliBoxDBOpenHelper(context);
- }
-
- public void open() {
- Log.i(TAG, "Database opened");
- database = dbhelper.getWritableDatabase();
- }
-
- public void close() {
- Log.i(TAG, "Database closed");
- dbhelper.close();
- }
-
- public Message createNotification(Message message) {
- ContentValues values = new ContentValues();
- values.put(SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_TITLE, message.getTitle());
- values.put(SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_MESSAGE, message.getMessage());
- long insertId = database.insert(SwahiliBoxDBOpenHelper.TABLE_NOTIFICATIONS, null, values);
- message.setId(insertId);
-
- return message;
- }
-
- public List findAll() {
-
- Cursor cursor = database.query(SwahiliBoxDBOpenHelper.TABLE_NOTIFICATIONS, allColumns,
- null, null, null, null, null);
- Log.i(TAG, "Returned: " + cursor.getCount());
- List messages = cursortoList(cursor);
- return messages;
- }
-
- private List cursortoList(Cursor cursor) {
- List messages = new ArrayList<>();
- if (cursor.getCount() > 0) {
- while (cursor.moveToNext()) {
- Message message = new Message();
- message.setId(cursor.getLong(cursor.getColumnIndex(SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_ID)));
- message.setTitle(cursor.getString(cursor.getColumnIndex(SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_TITLE)));
- message.setMessage(cursor.getString(cursor.getColumnIndex(SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_MESSAGE)));
-
- messages.add(message);
- }
- }
-
- return messages;
- }
-
- public boolean deleteMessage(Message message){
-
- String where = SwahiliBoxDBOpenHelper.COLUMN_NOTIFICATION_ID + "=" + message.getId();
- int result = database.delete(SwahiliBoxDBOpenHelper.TABLE_NOTIFICATIONS , where, null);
- return (result == 1);
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/helper/NotificationUtils.java b/app/src/main/java/ke/co/swahilibox/swahilibox/helper/NotificationUtils.java
deleted file mode 100644
index affe779..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/helper/NotificationUtils.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package ke.co.swahilibox.swahilibox.helper;
-
-import android.app.ActivityManager;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.BitmapFactory;
-import android.media.RingtoneManager;
-import android.os.Build;
-import android.support.v4.app.NotificationCompat;
-import android.text.TextUtils;
-
-import java.util.List;
-
-import ke.co.swahilibox.swahilibox.AppConfig;
-import ke.co.swahilibox.swahilibox.R;
-
-/**
- * Created by japheth on 11/15/15.
- */
-public class NotificationUtils {
- /**
- * Handles notifications
- */
- private static String TAG = NotificationUtils.class.getSimpleName();
- private Context context;
-
- public NotificationUtils() {
-
- }
-
- public NotificationUtils(Context context) {
- this.context = context;
- }
-
- //checks whether the app is i background or not
- public static boolean isAppInBackground(Context context) {
- boolean isInBackground = true;
- ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
- List runningAppProcess = activityManager.getRunningAppProcesses();
- for (ActivityManager.RunningAppProcessInfo processInfo : runningAppProcess) {
- if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
- for (String activeProcess : processInfo.pkgList) {
- if (activeProcess.equals(context.getPackageName())) {
- isInBackground = false;
- }
- }
- }
- }
- } else {
- List taskInfo = activityManager.getRunningTasks(1);
- ComponentName componentInfo = taskInfo.get(0).topActivity;
- if (componentInfo.getPackageName().equals(context.getPackageName())) {
- isInBackground = false;
- }
- }
- return isInBackground;
- }
-
- public void showNotificationMessage(String title, String message, Intent intent) {
-
- //check for empty push messages
- if (TextUtils.isEmpty(message))
- return;
- if (isAppInBackground(context)) {
- int icon = R.mipmap.ic_launcher;
- int notificationId = AppConfig.NOTIFICATION_ID;
-
- PendingIntent resultPendingIntent = PendingIntent.getActivity(
- context,
- 0,
- intent,
- PendingIntent.FLAG_CANCEL_CURRENT
- );
-
- NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
-
- NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
- context);
- Notification notification = mBuilder.setSmallIcon(icon).setTicker(title).setWhen(0)
- .setAutoCancel(true)
- .setContentTitle(title)
- .setSubText("SwahiliBox notification")
- .setStyle(inboxStyle)
- .setContentIntent(resultPendingIntent)
- .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
- .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), icon))
- .setContentText(message)
- .build();
-
- NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- notificationManager.notify(notificationId, notification);
- } else {
- intent.putExtra("title", title);
- intent.putExtra("message", message);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
- context.startActivity(intent);
- }
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/helper/ParseUtil.java b/app/src/main/java/ke/co/swahilibox/swahilibox/helper/ParseUtil.java
deleted file mode 100644
index 9a6a8c5..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/helper/ParseUtil.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package ke.co.swahilibox.swahilibox.helper;
-
-import android.app.Activity;
-import android.content.Context;
-import android.text.TextUtils;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.parse.Parse;
-import com.parse.ParseException;
-import com.parse.ParseInstallation;
-import com.parse.ParsePush;
-import com.parse.PushService;
-import com.parse.SaveCallback;
-
-import ke.co.swahilibox.swahilibox.AppConfig;
-
-/**
- * Created by japheth on 11/15/15.
- */
-public class ParseUtil {
- /**
- * Contains utility methods to interact with the parse api,ie
- * initializing parse, subscribing using email to send individual notifications
- */
- private static String TAG = ParseUtil.class.getSimpleName();
-
- public static void verifyParseConfiguration(Context context) {
- if (TextUtils.isEmpty(AppConfig.PARSE_APPLICATION_ID) || TextUtils.isEmpty(AppConfig.PARSE_CLIENT_KEY))
- Toast.makeText(context, "Please configure your app", Toast.LENGTH_SHORT).show();
- ((Activity) context).finish();
- }
-
- public static void registerParse(Context context) {
- // initializing parse library
- Parse.initialize(context, AppConfig.PARSE_APPLICATION_ID, AppConfig.PARSE_CLIENT_KEY);
- PushService.startServiceIfRequired(context);
- ParseInstallation.getCurrentInstallation().saveInBackground();
-
- ParsePush.subscribeInBackground(AppConfig.PARSE_CHANNEL, new SaveCallback() {
- @Override
- public void done(ParseException e) {
- Log.i(TAG, "Successfully subscribed to Parse!");
- }
- });
- }
-
-
- public static void subscribeWithEmail(String email) {
- ParseInstallation installation = new ParseInstallation();
- installation.put("email", email);
- installation.saveInBackground();
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/model/Message.java b/app/src/main/java/ke/co/swahilibox/swahilibox/model/Message.java
deleted file mode 100644
index fbdfc04..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/model/Message.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package ke.co.swahilibox.swahilibox.model;
-
-/**
- * Created by japheth on 11/16/15.
- */
-public class Message {
-
- private String message;
- private long timestamp;
- private long id;
- private String title;
-
- public Message() {
- }
-
- public Message(String message, long timestamp) {
- this.message = message;
- this.timestamp = timestamp;
- }
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public long getTimestamp() {
- return timestamp;
- }
-
- public void setTimestamp(long timestamp) {
- this.timestamp = timestamp;
- }
-}
diff --git a/app/src/main/java/ke/co/swahilibox/swahilibox/receiver/CustomPushReceiver.java b/app/src/main/java/ke/co/swahilibox/swahilibox/receiver/CustomPushReceiver.java
deleted file mode 100644
index a52b9f1..0000000
--- a/app/src/main/java/ke/co/swahilibox/swahilibox/receiver/CustomPushReceiver.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package ke.co.swahilibox.swahilibox.receiver;
-
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-import com.parse.ParsePushBroadcastReceiver;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import ke.co.swahilibox.swahilibox.Splash;
-import ke.co.swahilibox.swahilibox.database.SwahiliBoxDatasource;
-import ke.co.swahilibox.swahilibox.helper.NotificationUtils;
-import ke.co.swahilibox.swahilibox.model.Message;
-
-/**
- * Created by japheth on 11/16/15.
- */
-public class CustomPushReceiver extends ParsePushBroadcastReceiver {
-
- private final String TAG = CustomPushReceiver.class.getSimpleName();
-
- private NotificationUtils notificationUtils;
- SwahiliBoxDatasource datasource;
-
- private Intent parseIntent;
-
- public CustomPushReceiver() {
- super();
- Log.i(TAG, "Initialized the receiver");
- }
-
- @Override
- protected void onPushReceive(Context context, Intent intent) {
- super.onPushReceive(context, intent);
- datasource = new SwahiliBoxDatasource(context);
- datasource.open();
-
- if (intent == null)
- return;
-
- try {
- JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));
-
- Log.e(TAG, "Push received: " + json);
-
- parseIntent = intent;
-
- parsePushJson(context, json);
-
- } catch (JSONException e) {
- Log.e(TAG, "Push message json exception: " + e.getMessage());
- }
- }
-
- @Override
- protected void onPushDismiss(Context context, Intent intent) {
- super.onPushDismiss(context, intent);
- datasource.close();
- }
-
- @Override
- protected void onPushOpen(Context context, Intent intent) {
- super.onPushOpen(context, intent);
- }
-
- /**
- * Parses the push notification json
- *
- * @param context
- * @param json
- */
- private void parsePushJson(Context context, JSONObject json) {
- try {
- boolean isBackground = json.getBoolean("is_background");
- JSONObject data = json.getJSONObject("data");
- String title = data.getString("title");
- String message = data.getString("message");
-
- /**
- * Create message object
- * set attributes
- * save it
- */
- Message mess = new Message();
- mess.setMessage(message);
- mess.setTitle(title);
-
- datasource.createNotification(mess);
-
- Log.i(TAG, "Parsed JSON: " + title + message);
-
- if (!isBackground) {
- Intent resultIntent = new Intent(context, Splash.class);
- showNotificationMessage(context, title, message, resultIntent);
- }
-
- } catch (JSONException e) {
- Log.e(TAG, "Push message json exception: " + e.getMessage());
- }
- }
-
- /**
- * Shows the notification message in the notification bar
- * If the app is in background, launches the app
- *
- * @param context
- * @param title
- * @param message
- * @param intent
- */
- public void showNotificationMessage(Context context, String title, String message, Intent intent) {
-
- notificationUtils = new NotificationUtils(context);
-
- intent.putExtras(parseIntent.getExtras());
-
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-
- notificationUtils.showNotificationMessage(title, message, intent);
- }
-}
diff --git a/app/src/main/res/mipmap-hdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable/ic_info_outline_black_24dp.png
similarity index 100%
rename from app/src/main/res/mipmap-hdpi/ic_info_outline_black_24dp.png
rename to app/src/main/res/drawable/ic_info_outline_black_24dp.png
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..0d025f9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..1f6bb29
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_camera.xml b/app/src/main/res/drawable/ic_menu_camera.xml
new file mode 100644
index 0000000..634fe92
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_camera.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_gallery.xml b/app/src/main/res/drawable/ic_menu_gallery.xml
new file mode 100644
index 0000000..03c7709
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_gallery.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_manage.xml b/app/src/main/res/drawable/ic_menu_manage.xml
new file mode 100644
index 0000000..aeb047d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_manage.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_menu_send.xml b/app/src/main/res/drawable/ic_menu_send.xml
new file mode 100644
index 0000000..fdf1c90
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_send.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_share.xml b/app/src/main/res/drawable/ic_menu_share.xml
new file mode 100644
index 0000000..338d95a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_share.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_slideshow.xml b/app/src/main/res/drawable/ic_menu_slideshow.xml
new file mode 100644
index 0000000..5e9e163
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_slideshow.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/mipmap-hdpi/ic_power_settings_new_black_24dp.png b/app/src/main/res/drawable/ic_power_settings_new_black_24dp.png
similarity index 100%
rename from app/src/main/res/mipmap-hdpi/ic_power_settings_new_black_24dp.png
rename to app/src/main/res/drawable/ic_power_settings_new_black_24dp.png
diff --git a/app/src/main/res/drawable/launcher_icon.png b/app/src/main/res/drawable/launcher_icon.png
new file mode 100644
index 0000000..e1e3d60
Binary files /dev/null and b/app/src/main/res/drawable/launcher_icon.png differ
diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml
new file mode 100644
index 0000000..6d81870
--- /dev/null
+++ b/app/src/main/res/drawable/side_nav_bar.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-mdpi/splash.jpg b/app/src/main/res/drawable/splash.jpg
similarity index 100%
rename from app/src/main/res/mipmap-mdpi/splash.jpg
rename to app/src/main/res/drawable/splash.jpg
diff --git a/app/src/main/res/layout/activity_alerts.xml b/app/src/main/res/layout/activity_alerts.xml
new file mode 100644
index 0000000..a2da2d0
--- /dev/null
+++ b/app/src/main/res/layout/activity_alerts.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_log_in.xml b/app/src/main/res/layout/activity_log_in.xml
index 17227d9..4e5f4e0 100644
--- a/app/src/main/res/layout/activity_log_in.xml
+++ b/app/src/main/res/layout/activity_log_in.xml
@@ -1,85 +1,56 @@
-
-
+ tools:context=".LogIn">
+ android:src="@drawable/login"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.0" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_marginStart="8dp"
+ android:layout_marginTop="220dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginBottom="0dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.237" />
+
+
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index 039b1a7..0000000
--- a/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_sign_up.xml b/app/src/main/res/layout/activity_sign_up.xml
deleted file mode 100644
index d93fa38..0000000
--- a/app/src/main/res/layout/activity_sign_up.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/app_bar_alerts.xml b/app/src/main/res/layout/app_bar_alerts.xml
new file mode 100644
index 0000000..488c976
--- /dev/null
+++ b/app/src/main/res/layout/app_bar_alerts.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_alerts.xml b/app/src/main/res/layout/content_alerts.xml
new file mode 100644
index 0000000..945b18c
--- /dev/null
+++ b/app/src/main/res/layout/content_alerts.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
deleted file mode 100644
index ba7c53e..0000000
--- a/app/src/main/res/layout/content_main.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/app/src/main/res/layout/drawer_header.xml b/app/src/main/res/layout/drawer_header.xml
deleted file mode 100644
index a2dabf7..0000000
--- a/app/src/main/res/layout/drawer_header.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml
deleted file mode 100644
index 872ad5c..0000000
--- a/app/src/main/res/layout/list_item.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/nav_header_alerts.xml b/app/src/main/res/layout/nav_header_alerts.xml
new file mode 100644
index 0000000..9891744
--- /dev/null
+++ b/app/src/main/res/layout/nav_header_alerts.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/notify_item.xml b/app/src/main/res/layout/notify_item.xml
new file mode 100644
index 0000000..a9ba3c1
--- /dev/null
+++ b/app/src/main/res/layout/notify_item.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/splash.xml b/app/src/main/res/layout/splash.xml
similarity index 85%
rename from app/src/main/res/drawable/splash.xml
rename to app/src/main/res/layout/splash.xml
index f6d0f44..63e9794 100644
--- a/app/src/main/res/drawable/splash.xml
+++ b/app/src/main/res/layout/splash.xml
@@ -5,6 +5,6 @@
-
+ android:src="@drawable/splash" />
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_alerts_drawer.xml b/app/src/main/res/menu/activity_alerts_drawer.xml
new file mode 100644
index 0000000..d12bca6
--- /dev/null
+++ b/app/src/main/res/menu/activity_alerts_drawer.xml
@@ -0,0 +1,22 @@
+
+
diff --git a/app/src/main/res/menu/alerts.xml b/app/src/main/res/menu/alerts.xml
new file mode 100644
index 0000000..a2411e3
--- /dev/null
+++ b/app/src/main/res/menu/alerts.xml
@@ -0,0 +1,9 @@
+
+
diff --git a/app/src/main/res/menu/menu_drawer.xml b/app/src/main/res/menu/menu_drawer.xml
deleted file mode 100644
index 0879c04..0000000
--- a/app/src/main/res/menu/menu_drawer.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_item.xml b/app/src/main/res/menu/menu_item.xml
new file mode 100644
index 0000000..a68ffa3
--- /dev/null
+++ b/app/src/main/res/menu/menu_item.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/message_list_item_context.xml b/app/src/main/res/menu/message_list_item_context.xml
deleted file mode 100644
index 8c84b54..0000000
--- a/app/src/main/res/menu/message_list_item_context.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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
index e1e3d60..898f3ed 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dffca36
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-hdpi/splash.jpg b/app/src/main/res/mipmap-hdpi/splash.jpg
deleted file mode 100644
index cc0293c..0000000
Binary files a/app/src/main/res/mipmap-hdpi/splash.jpg and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_info_outline_black_24dp.png b/app/src/main/res/mipmap-mdpi/ic_info_outline_black_24dp.png
deleted file mode 100644
index e0c9fe0..0000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_info_outline_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index d47f3e4..64ba76f 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dae5e08
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_power_settings_new_black_24dp.png b/app/src/main/res/mipmap-mdpi/ic_power_settings_new_black_24dp.png
deleted file mode 100644
index b52a029..0000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_power_settings_new_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_info_outline_black_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_info_outline_black_24dp.png
deleted file mode 100644
index b706f0d..0000000
Binary files a/app/src/main/res/mipmap-xhdpi/ic_info_outline_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 7cf446f..e5ed465 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..14ed0af
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_power_settings_new_black_24dp.png b/app/src/main/res/mipmap-xhdpi/ic_power_settings_new_black_24dp.png
deleted file mode 100644
index e9825fb..0000000
Binary files a/app/src/main/res/mipmap-xhdpi/ic_power_settings_new_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/splash.jpg b/app/src/main/res/mipmap-xhdpi/splash.jpg
deleted file mode 100644
index 1a8224e..0000000
Binary files a/app/src/main/res/mipmap-xhdpi/splash.jpg and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_info_outline_black_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_info_outline_black_24dp.png
deleted file mode 100644
index 3847a9f..0000000
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_info_outline_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index f8801e7..b0907ca 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..d8ae031
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_power_settings_new_black_24dp.png b/app/src/main/res/mipmap-xxhdpi/ic_power_settings_new_black_24dp.png
deleted file mode 100644
index 75af3f9..0000000
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_power_settings_new_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxhdpi/splash.jpg b/app/src/main/res/mipmap-xxhdpi/splash.jpg
deleted file mode 100644
index 8cb5337..0000000
Binary files a/app/src/main/res/mipmap-xxhdpi/splash.jpg and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_info_outline_black_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_info_outline_black_24dp.png
deleted file mode 100644
index c1e2a03..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_info_outline_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index f792ac6..2c18de9 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..beed3cd
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_power_settings_new_black_24dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_power_settings_new_black_24dp.png
deleted file mode 100644
index d206fa4..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_power_settings_new_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/splash.png b/app/src/main/res/mipmap-xxxhdpi/splash.png
deleted file mode 100644
index ec85ca9..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/splash.png and /dev/null differ
diff --git a/app/src/main/res/transition/push_down_in.xml b/app/src/main/res/transition/push_down_in.xml
deleted file mode 100644
index c4e1b04..0000000
--- a/app/src/main/res/transition/push_down_in.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/transition/push_down_out.xml b/app/src/main/res/transition/push_down_out.xml
deleted file mode 100644
index 7c621f3..0000000
--- a/app/src/main/res/transition/push_down_out.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/transition/push_up_in.xml b/app/src/main/res/transition/push_up_in.xml
deleted file mode 100644
index 847ea6f..0000000
--- a/app/src/main/res/transition/push_up_in.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/transition/push_up_out.xml b/app/src/main/res/transition/push_up_out.xml
deleted file mode 100644
index c41b2fa..0000000
--- a/app/src/main/res/transition/push_up_out.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/transition/slide_in_left.xml b/app/src/main/res/transition/slide_in_left.xml
deleted file mode 100644
index 20bc37a..0000000
--- a/app/src/main/res/transition/slide_in_left.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/transition/slide_in_right.xml b/app/src/main/res/transition/slide_in_right.xml
deleted file mode 100644
index 3ebed28..0000000
--- a/app/src/main/res/transition/slide_in_right.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/transition/slide_out_left.xml b/app/src/main/res/transition/slide_out_left.xml
deleted file mode 100644
index 060b2d9..0000000
--- a/app/src/main/res/transition/slide_out_left.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/transition/slide_out_right.xml b/app/src/main/res/transition/slide_out_right.xml
deleted file mode 100644
index 62e56e8..0000000
--- a/app/src/main/res/transition/slide_out_right.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
\ 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
index dbbdd40..fd7a058 100644
--- a/app/src/main/res/values-v21/styles.xml
+++ b/app/src/main/res/values-v21/styles.xml
@@ -3,7 +3,6 @@
diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml
deleted file mode 100644
index 63fc816..0000000
--- a/app/src/main/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- 64dp
-
diff --git a/app/src/main/res/values/color.xml b/app/src/main/res/values/colors.xml
similarity index 96%
rename from app/src/main/res/values/color.xml
rename to app/src/main/res/values/colors.xml
index 05eda34..ebf869e 100644
--- a/app/src/main/res/values/color.xml
+++ b/app/src/main/res/values/colors.xml
@@ -7,4 +7,4 @@
#212121
#727272
#FFFFFF
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 812cb7b..4ab4520 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -2,5 +2,7 @@
16dp
16dp
+ 8dp
+ 176dp
16dp
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1e25d4e..4e7eb64 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,30 +1,31 @@
- SwahiliBox
- Alerts
+ swahilibox
+ Alerts
+ Open navigation drawer
+ Close navigation drawer
+ Android Studio
+ android.studio@android.com
+ Navigation header
+ Settings
+
+ Home
+ Gallery
+ Slideshow
+ Tools
+ Share
+ Send
+
+ SignUp
+ LogIn
+ AboutUS
+
Setting
Invite Friends
About Us
- Log In
- Sign Up
Log Out
- Open
- Close
- Sign in
- Delete
+ Delete All Notification
-
- Email
- Password (optional)
- Sign in or register
- Sign in
- This email address is invalid
- This password is too short
- This password is incorrect
- This field is required
- "Contacts permissions are needed for providing email
- completions."
-
- SignUp
- LogIn
- AboutUS
+ //facebook ids
+ 294662301472915
+ fb294662301472915
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index fb775dc..545b9c6 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,30 +1,20 @@
-
-
-
-
-
diff --git a/app/src/test/java/com/sam/swahilibox/ExampleUnitTest.java b/app/src/test/java/com/sam/swahilibox/ExampleUnitTest.java
new file mode 100644
index 0000000..8857c1e
--- /dev/null
+++ b/app/src/test/java/com/sam/swahilibox/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.sam.swahilibox;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/app/src/test/java/ke/co/swahilibox/swahilibox/ExampleUnitTest.java b/app/src/test/java/ke/co/swahilibox/swahilibox/ExampleUnitTest.java
deleted file mode 100644
index 3f06ad3..0000000
--- a/app/src/test/java/ke/co/swahilibox/swahilibox/ExampleUnitTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package ke.co.swahilibox.swahilibox;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * To work on unit tests, switch the Test Artifact in the Build Variants view.
- */
-public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() throws Exception {
- assertEquals(4, 2 + 2);
- }
-}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index be515a8..b3deac9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,19 +2,26 @@
buildscript {
repositories {
+ google()
jcenter()
+
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.3.0'
-
+ classpath 'com.android.tools.build:gradle:3.3.1'
+ classpath 'com.google.gms:google-services:4.0.1'
+
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
+
+
allprojects {
repositories {
+ google()
jcenter()
+
}
}
diff --git a/gradle.properties b/gradle.properties
index 1d3591c..82618ce 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,18 +1,15 @@
# 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
-
+org.gradle.jvmargs=-Xmx1536m
# 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
+# org.gradle.parallel=true
+
+
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 8c0fb64..f6b961f 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index fe637b8..29cc58f 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun Nov 15 13:31:42 EST 2015
+#Sat May 04 22:09:38 EAT 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
diff --git a/gradlew b/gradlew
index 91a7e26..cccdd3d 100755
--- a/gradlew
+++ b/gradlew
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
##############################################################################
##
@@ -6,20 +6,38 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
-warn ( ) {
+warn () {
echo "$*"
}
-die ( ) {
+die () {
echo
echo "$*"
echo
@@ -30,6 +48,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
+nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,31 +59,11 @@ case "`uname`" in
MINGW* )
msys=true
;;
+ NONSTOP* )
+ nonstop=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.
@@ -90,7 +89,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -114,6 +113,7 @@ fi
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
@@ -154,11 +154,19 @@ if $cygwin ; then
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=("$@")
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index aec9973..e95643d 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -8,14 +8,14 @@
@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 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=
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
@@ -46,10 +46,9 @@ echo location of your Java installation.
goto fail
:init
-@rem Get command-line arguments, handling Windowz variants
+@rem Get command-line arguments, handling Windows 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.
@@ -60,11 +59,6 @@ set _SKIP=2
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