Adding new Android SDK
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/b30b60b3 Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/b30b60b3 Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/b30b60b3 Branch: refs/heads/master Commit: b30b60b32c298d78abfcbf42d7932b0ebdffb98d Parents: 7e0ffbc Author: Robert Walsh <[email protected]> Authored: Mon Aug 8 15:37:35 2016 -0500 Committer: Robert Walsh <[email protected]> Committed: Mon Aug 8 15:37:35 2016 -0500 ---------------------------------------------------------------------- sdks/android/Samples/ActivityFeed/.gitignore | 8 + .../ActivityFeed/activityfeed/.gitignore | 1 + .../ActivityFeed/activityfeed/build.gradle | 27 ++ .../ActivityFeed/activityfeed/libs/gcm.jar | Bin 0 -> 13662 bytes .../activityfeed/proguard-rules.pro | 17 + .../usergrid/activityfeed/ApplicationTest.java | 13 + .../activityfeed/src/main/AndroidManifest.xml | 53 +++ .../usergrid/activityfeed/ActivityEntity.java | 86 ++++ .../usergrid/activityfeed/GCMIntentService.java | 87 ++++ .../usergrid/activityfeed/UsergridManager.java | 259 ++++++++++ .../activities/CreateAccountActivity.java | 67 +++ .../activityfeed/activities/FeedActivity.java | 142 ++++++ .../activityfeed/activities/FollowActivity.java | 59 +++ .../activityfeed/activities/MainActivity.java | 87 ++++ .../callbacks/GetFeedMessagesCallback.java | 27 ++ .../callbacks/PostFeedMessageCallback.java | 25 + .../activityfeed/helpers/ActionBarHelpers.java | 53 +++ .../helpers/AlertDialogHelpers.java | 61 +++ .../activityfeed/helpers/FeedAdapter.java | 153 ++++++ .../src/main/res/drawable/in_message_bg.9.png | Bin 0 -> 1160 bytes .../src/main/res/drawable/out_message_bg.9.png | Bin 0 -> 1072 bytes .../src/main/res/drawable/usergridguy.png | Bin 0 -> 6230 bytes .../src/main/res/layout/action_bar_layout.xml | 29 ++ .../main/res/layout/activity_create_account.xml | 101 ++++ .../src/main/res/layout/activity_feed.xml | 46 ++ .../src/main/res/layout/activity_follow.xml | 44 ++ .../src/main/res/layout/activity_main.xml | 87 ++++ .../src/main/res/layout/message_layout.xml | 43 ++ .../main/res/layout/scrollable_alert_view.xml | 35 ++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../src/main/res/values-w820dp/dimens.xml | 6 + .../activityfeed/src/main/res/values/colors.xml | 8 + .../activityfeed/src/main/res/values/dimens.xml | 5 + .../src/main/res/values/strings.xml | 3 + .../activityfeed/src/main/res/values/styles.xml | 19 + .../usergrid/activityfeed/ExampleUnitTest.java | 15 + sdks/android/Samples/ActivityFeed/build.gradle | 23 + .../Samples/ActivityFeed/gradle.properties | 18 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + sdks/android/Samples/ActivityFeed/gradlew | 160 +++++++ sdks/android/Samples/ActivityFeed/gradlew.bat | 90 ++++ .../Samples/ActivityFeed/settings.gradle | 2 + sdks/android/Samples/Push/.gitignore | 8 + sdks/android/Samples/Push/build.gradle | 22 + sdks/android/Samples/Push/gradle.properties | 18 + .../Push/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + sdks/android/Samples/Push/gradlew | 160 +++++++ sdks/android/Samples/Push/gradlew.bat | 90 ++++ sdks/android/Samples/Push/push/.gitignore | 1 + sdks/android/Samples/Push/push/build.gradle | 27 ++ sdks/android/Samples/Push/push/libs/gcm.jar | Bin 0 -> 13662 bytes .../Samples/Push/push/proguard-rules.pro | 17 + .../apache/usergrid/push/ApplicationTest.java | 13 + .../Push/push/src/main/AndroidManifest.xml | 51 ++ .../apache/usergrid/push/GCMIntentService.java | 85 ++++ .../org/apache/usergrid/push/MainActivity.java | 162 +++++++ .../apache/usergrid/push/SettingsActivity.java | 68 +++ .../Push/push/src/main/res/drawable/info.png | Bin 0 -> 44546 bytes .../push/src/main/res/drawable/usergridguy.png | Bin 0 -> 6230 bytes .../push/src/main/res/layout/activity_main.xml | 69 +++ .../src/main/res/layout/activity_settings.xml | 95 ++++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../push/src/main/res/values-w820dp/dimens.xml | 6 + .../Push/push/src/main/res/values/colors.xml | 6 + .../Push/push/src/main/res/values/dimens.xml | 5 + .../Push/push/src/main/res/values/strings.xml | 3 + .../Push/push/src/main/res/values/styles.xml | 11 + .../apache/usergrid/push/ExampleUnitTest.java | 15 + sdks/android/Samples/Push/settings.gradle | 2 + sdks/android/UsergridAndroidSDK/.gitignore | 8 + sdks/android/UsergridAndroidSDK/build.gradle | 70 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + sdks/android/UsergridAndroidSDK/gradlew | 160 +++++++ sdks/android/UsergridAndroidSDK/gradlew.bat | 90 ++++ .../libs/usergrid-java-client-2.1.0.jar | Bin 0 -> 1991936 bytes .../UsergridAndroidSDK/proguard-rules.pro | 17 + .../usergrid/android/ApplicationTest.java | 75 +++ .../java/org/apache/usergrid/android/Book.java | 26 + .../src/main/AndroidManifest.xml | 17 + .../apache/usergrid/android/UsergridAsync.java | 474 +++++++++++++++++++ .../usergrid/android/UsergridEntityAsync.java | 110 +++++ .../usergrid/android/UsergridResponseAsync.java | 38 ++ .../usergrid/android/UsergridSharedDevice.java | 175 +++++++ .../usergrid/android/UsergridUserAsync.java | 125 +++++ .../UsergridCheckAvailabilityCallback.java | 21 + .../callbacks/UsergridResponseCallback.java | 24 + .../android/tasks/UsergridAsyncTask.java | 45 ++ .../src/main/res/values/strings.xml | 3 + 99 files changed, 4389 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/.gitignore ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/.gitignore b/sdks/android/Samples/ActivityFeed/.gitignore new file mode 100644 index 0000000..c6cbe56 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/.gitignore ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/.gitignore b/sdks/android/Samples/ActivityFeed/activityfeed/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/.gitignore @@ -0,0 +1 @@ +/build http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/build.gradle ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/build.gradle b/sdks/android/Samples/ActivityFeed/activityfeed/build.gradle new file mode 100644 index 0000000..91d4c7e --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion "22.0.1" + + defaultConfig { + applicationId "org.apache.usergrid.activityfeed" + minSdkVersion 17 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.3.0' + compile project(':UsergridAndroidSDK') +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/libs/gcm.jar ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/libs/gcm.jar b/sdks/android/Samples/ActivityFeed/activityfeed/libs/gcm.jar new file mode 100755 index 0000000..ac109a8 Binary files /dev/null and b/sdks/android/Samples/ActivityFeed/activityfeed/libs/gcm.jar differ http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/proguard-rules.pro ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/proguard-rules.pro b/sdks/android/Samples/ActivityFeed/activityfeed/proguard-rules.pro new file mode 100644 index 0000000..73ed137 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/ApigeeCorporation/Developer/android_sdk_files/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/androidTest/java/org/apache/usergrid/activityfeed/ApplicationTest.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/androidTest/java/org/apache/usergrid/activityfeed/ApplicationTest.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/androidTest/java/org/apache/usergrid/activityfeed/ApplicationTest.java new file mode 100644 index 0000000..b376e2f --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/androidTest/java/org/apache/usergrid/activityfeed/ApplicationTest.java @@ -0,0 +1,13 @@ +package org.apache.usergrid.activityfeed; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> + */ +public class ApplicationTest extends ApplicationTestCase<Application> { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/AndroidManifest.xml ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/AndroidManifest.xml b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ec275c8 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/AndroidManifest.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.apache.usergrid.activityfeed"> + + <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> + <uses-permission android:name="android.permission.GET_ACCOUNTS" /> + <uses-permission android:name="android.permission.WAKE_LOCK" /> + + <permission + android:name="org.apache.usergrid.activityfeed.gcm.permission.C2D_MESSAGE" + android:protectionLevel="signature" /> + + <uses-permission android:name="org.apache.usergrid.activityfeed.gcm.permission.C2D_MESSAGE" /> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:theme="@style/AppTheme"> + + <receiver + android:name="com.google.android.gcm.GCMBroadcastReceiver" + android:permission="com.google.android.c2dm.permission.SEND" > + <intent-filter> + <action android:name="com.google.android.c2dm.intent.RECEIVE" /> + <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> + + <category android:name="org.apache.usergrid.activityfeed" /> + </intent-filter> + </receiver> + <service android:name=".GCMIntentService" /> + + <activity + android:name=".activities.MainActivity" + android:label=""> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + <activity + android:name=".activities.CreateAccountActivity" + android:label=""> </activity> + <activity + android:name=".activities.FeedActivity" + android:windowSoftInputMode="stateHidden" + android:label=""> </activity> + <activity android:name=".activities.FollowActivity"> </activity> + </application> + +</manifest> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/ActivityEntity.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/ActivityEntity.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/ActivityEntity.java new file mode 100644 index 0000000..4c19085 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/ActivityEntity.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; + +import org.apache.usergrid.java.client.model.UsergridEntity; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; + +@SuppressWarnings("unused") +public class ActivityEntity extends UsergridEntity { + + public static final String ACTIVITY_ENTITY_TYPE = "activity"; + + private String content; + private JsonNode actor; + + @Nullable @JsonIgnore + public String getDisplayName() { + if( actor != null ) { + JsonNode displayName = actor.get("displayName"); + if( displayName != null ) { + return displayName.asText(); + } + } + return null; + } + + @Nullable public String getContent() { return this.content; } + public void setContent(@NonNull String content) { + this.content = content; + } + + @Nullable public JsonNode getActor() { return this.actor; } + public void setActor(@NonNull JsonNode actor) { + this.actor = actor; + } + + public ActivityEntity() { + super(ACTIVITY_ENTITY_TYPE); + } + + public ActivityEntity(@JsonProperty("type") @NotNull String type) { + super(type); + } + + public ActivityEntity(@NonNull final String displayName, @NonNull final String email, @Nullable final String picture, @NonNull final String content) { + super(ACTIVITY_ENTITY_TYPE); + HashMap<String,Object> actorMap = new HashMap<>(); + actorMap.put("displayName",displayName); + actorMap.put("email",email); + if( picture != null ) { + HashMap<String,Object> imageMap = new HashMap<>(); + imageMap.put("url",picture); + imageMap.put("height",80); + imageMap.put("width",80); + actorMap.put("image",imageMap); + } + HashMap<String,Object> activityMap = new HashMap<>(); + activityMap.put("verb","post"); + activityMap.put("actor",actorMap); + activityMap.put("content",content); + this.putProperties(activityMap); + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/GCMIntentService.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/GCMIntentService.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/GCMIntentService.java new file mode 100644 index 0000000..36cb9f1 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/GCMIntentService.java @@ -0,0 +1,87 @@ +package org.apache.usergrid.activityfeed; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.support.v4.app.NotificationCompat; +import android.util.Log; + +import com.google.android.gcm.GCMBaseIntentService; + +import org.apache.usergrid.activityfeed.activities.MainActivity; + +public class GCMIntentService extends GCMBaseIntentService { + + public GCMIntentService() { + super(UsergridManager.GCM_SENDER_ID); + } + + @Override + protected void onRegistered(Context context, String registrationId) { + Log.i(TAG, "Device registered: " + registrationId); + UsergridManager.registerPush(context,registrationId); + } + + @Override + protected void onUnregistered(Context context, String registrationId) { + Log.i(TAG, "Device unregistered"); + } + + @Override + protected void onMessage(Context context, Intent intent) { + String message = intent.getExtras().getString("data"); + Log.i(TAG, "Received message: " + message); + generateNotification(context, message); + } + + @Override + protected void onDeletedMessages(Context context, int total) { + Log.i(TAG, "Received deleted messages notification"); + String message = "GCM server deleted " + total +" pending messages!"; + generateNotification(context, message); + } + + @Override + public void onError(Context context, String errorId) { + Log.i(TAG, "Received error: " + errorId); + } + + @Override + protected boolean onRecoverableError(Context context, String errorId) { + Log.i(TAG, "Received recoverable error: " + errorId); + return super.onRecoverableError(context, errorId); + } + + /** + * Issues a Notification to inform the user that server has sent a message. + */ + private static void generateNotification(Context context, String message) { + long when = System.currentTimeMillis(); + NotificationManager notificationManager = (NotificationManager) + context.getSystemService(Context.NOTIFICATION_SERVICE); + + Intent notificationIntent = new Intent(context, MainActivity.class); + // set intent so it does not start a new activity + notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0); + + Notification notification = new NotificationCompat.Builder(context) + .setContentText(message) + .setContentTitle(context.getString(R.string.app_name)) + .setWhen(when) + .setSmallIcon(R.drawable.usergridguy) + .setContentIntent(intent) + .build(); + + notification.flags |= Notification.FLAG_AUTO_CANCEL; + + // Play default notification sound + notification.defaults |= Notification.DEFAULT_SOUND; + + // Vibrate if vibrate is enabled + notification.defaults |= Notification.DEFAULT_VIBRATE; + notificationManager.notify(0, notification); + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/UsergridManager.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/UsergridManager.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/UsergridManager.java new file mode 100644 index 0000000..b201631 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/UsergridManager.java @@ -0,0 +1,259 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed; + +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.support.annotation.NonNull; +import android.util.Log; + +import com.google.android.gcm.GCMRegistrar; + +import org.apache.usergrid.activityfeed.activities.FeedActivity; +import org.apache.usergrid.activityfeed.callbacks.GetFeedMessagesCallback; +import org.apache.usergrid.activityfeed.callbacks.PostFeedMessageCallback; +import org.apache.usergrid.activityfeed.helpers.AlertDialogHelpers; +import org.apache.usergrid.android.UsergridAsync; +import org.apache.usergrid.android.UsergridSharedDevice; +import org.apache.usergrid.android.UsergridUserAsync; +import org.apache.usergrid.android.callbacks.UsergridResponseCallback; +import org.apache.usergrid.java.client.Usergrid; +import org.apache.usergrid.java.client.UsergridEnums; +import org.apache.usergrid.java.client.UsergridRequest; +import org.apache.usergrid.java.client.auth.UsergridUserAuth; +import org.apache.usergrid.java.client.model.UsergridEntity; +import org.apache.usergrid.java.client.model.UsergridUser; +import org.apache.usergrid.java.client.query.UsergridQuery; +import org.apache.usergrid.java.client.response.UsergridResponse; +import org.apache.usergrid.java.client.response.UsergridResponseError; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public final class UsergridManager { + + private static final String ORG_ID = "rwalsh"; + private static final String APP_ID = "sandbox"; + private static final String BASE_URL = "https://api.usergrid.com"; + private static final String ANDROID_NOTIFIER_ID = "androidPushNotifier"; + + public static String GCM_SENDER_ID = "186455511595"; + public static String GCM_REGISTRATION_ID = ""; + + private UsergridManager() {} + + public static void initializeSharedInstance(@NonNull final Context context) { + Usergrid.initSharedInstance(ORG_ID,APP_ID,BASE_URL); + Usergrid.setAuthMode(UsergridEnums.UsergridAuthMode.USER); + UsergridEntity.mapCustomSubclassToType(ActivityEntity.ACTIVITY_ENTITY_TYPE,ActivityEntity.class); + UsergridSharedDevice.saveSharedDevice(context, new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { } + }); + registerPush(context); + } + + public static void registerPush(Context context) { + final String regId = GCMRegistrar.getRegistrationId(context); + if ("".equals(regId)) { + GCMRegistrar.register(context, GCM_SENDER_ID); + } else { + if (GCMRegistrar.isRegisteredOnServer(context)) { + Log.i("", "Already registered with GCM"); + } else { + registerPush(context, regId); + } + } + } + + public static void registerPush(@NonNull final Context context, @NonNull final String registrationId) { + GCM_REGISTRATION_ID = registrationId; + UsergridAsync.applyPushToken(context, registrationId, ANDROID_NOTIFIER_ID, new UsergridResponseCallback() { + @Override + public void onResponse(@NonNull UsergridResponse response) { + if( !response.ok() && response.getResponseError() != null ) { + System.out.print("Error Description :" + response.getResponseError().toString()); + } + } + }); + } + + public static void loginUser(@NonNull final Activity activity, @NonNull final String username, @NonNull final String password) { + UsergridAsync.authenticateUser(new UsergridUserAuth(username,password), new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull final UsergridResponse response) { + final UsergridUser currentUser = Usergrid.getCurrentUser(); + if( response.ok() && currentUser != null ) { + UsergridAsync.connect("users", "me", "devices", UsergridSharedDevice.getSharedDeviceUUID(activity), new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { + AlertDialogHelpers.showScrollableAlert(activity,"Authenticate User Successful","User Description: \n\n " + currentUser.toPrettyString(), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + activity.startActivity(new Intent(activity,FeedActivity.class)); + } + }); + } + }); + } else { + AlertDialogHelpers.showAlert(activity,"Error Authenticating User","Invalid username or password."); + } + } + }); + } + + public static void logoutCurrentUser(@NonNull final Activity activity) { + UsergridAsync.disconnect("users", "me", "devices", UsergridSharedDevice.getSharedDevice(activity).getUuid(), new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { + UsergridAsync.logoutCurrentUser(new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { + System.out.print(response.toString()); + } + }); + } + }); + } + + public static void createUserAccount(@NonNull final Activity activity, @NonNull final String name, @NonNull final String username, @NonNull final String email, @NonNull final String password) { + final UsergridUser user = new UsergridUser(name,username,email,password); + UsergridUserAsync.create(user, new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { + final UsergridUser responseUser = response.user(); + if( response.ok() && responseUser != null ) { + AlertDialogHelpers.showScrollableAlert(activity, "Creating Account Successful", "User Description: \n\n " + responseUser.toPrettyString(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + activity.finish(); + } + }); + } else { + String errorMessage = "Unknown Error"; + UsergridResponseError responseError = response.getResponseError(); + if( responseError != null ) { + errorMessage = responseError.getErrorDescription(); + } + AlertDialogHelpers.showAlert(activity,"Error Creating Account",errorMessage); + } + } + }); + } + + @SuppressWarnings("unchecked") + public static void getFeedMessages(@NonNull final GetFeedMessagesCallback callback) { + final UsergridQuery feedMessagesQuery = new UsergridQuery("users/me/feed").desc(UsergridEnums.UsergridEntityProperties.CREATED.toString()); + UsergridAsync.GET(feedMessagesQuery, new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { + ArrayList<ActivityEntity> feedMessages = new ArrayList<>(); + if( response.ok() ) { + List feedEntities = response.getEntities(); + if( feedEntities != null ) { + Collections.reverse(feedEntities); + feedMessages.addAll((List<ActivityEntity>)feedEntities); + } + } + callback.onResponse(feedMessages); + } + }); + } + + public static void postFeedMessage(@NonNull final String messageText, @NonNull final PostFeedMessageCallback callback) { + final UsergridUser currentUser = Usergrid.getCurrentUser(); + if( currentUser != null ) { + String usernameOrEmail = currentUser.usernameOrEmail(); + if( usernameOrEmail == null ) { + usernameOrEmail = ""; + } + String email = currentUser.getEmail(); + if( email == null ) { + email = ""; + } + String picture = currentUser.getPicture(); + final ActivityEntity activityEntity = new ActivityEntity(usernameOrEmail,email,picture,messageText); + UsergridAsync.POST("users/me/activities",activityEntity.toMapValue(), new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { + final UsergridEntity responseEntity = response.entity(); + if( response.ok() && responseEntity != null && responseEntity instanceof ActivityEntity ) { + callback.onSuccess((ActivityEntity)responseEntity); + UsergridManager.sendPushToFollowers(messageText); + } + } + }); + } + } + + public static void followUser(@NonNull final Activity activity, @NonNull final String username) { + UsergridAsync.connect("users", "me", "following", "users", username, new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { + if( response.ok() ) { + activity.finish(); + } else { + String errorMessage = "Unknown Error"; + UsergridResponseError responseError = response.getResponseError(); + if( responseError != null ) { + String errorDescription = responseError.getErrorDescription(); + if( errorDescription != null ) { + errorMessage = errorDescription; + } + } + AlertDialogHelpers.showAlert(activity,"Error Following User",errorMessage); + } + } + }); + } + + public static void sendPushToFollowers(@NonNull final String message) { + HashMap<String,String> notificationMap = new HashMap<>(); + notificationMap.put(ANDROID_NOTIFIER_ID,message); + final HashMap<String,HashMap<String,String>> payloadMap = new HashMap<>(); + payloadMap.put("payloads",notificationMap); + + UsergridAsync.GET("users/me/followers", new UsergridResponseCallback() { + @Override + public void onResponse(@NotNull UsergridResponse response) { + if( response.ok() ) { + String followerUserNames = ""; + final List<UsergridUser> users = response.users(); + if( users != null && !users.isEmpty() ) { + for( UsergridUser user : users ) { + String username = user.getUsername(); + if( username != null && !username.isEmpty() ) { + followerUserNames += username + ";"; + } + } + if( !followerUserNames.isEmpty() ) { + final UsergridRequest notificationRequest = new UsergridRequest(UsergridEnums.UsergridHttpMethod.POST,UsergridRequest.APPLICATION_JSON_MEDIA_TYPE,Usergrid.clientAppUrl(),null,payloadMap,Usergrid.authForRequests(),"users", followerUserNames, "notifications"); + UsergridAsync.sendRequest(notificationRequest, new UsergridResponseCallback() { + @Override + public void onResponse(@NonNull UsergridResponse response) {} + }); + } + } + } + } + }); + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/CreateAccountActivity.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/CreateAccountActivity.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/CreateAccountActivity.java new file mode 100644 index 0000000..0f72fbb --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/CreateAccountActivity.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.activities; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import org.apache.usergrid.activityfeed.R; +import org.apache.usergrid.activityfeed.UsergridManager; +import org.apache.usergrid.activityfeed.helpers.ActionBarHelpers; +import org.apache.usergrid.activityfeed.helpers.AlertDialogHelpers; + +public class CreateAccountActivity extends AppCompatActivity { + + private static final String actionBarTitle = "Create Account"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_create_account); + + ActionBarHelpers.setCustomViewForActionBarWithTitle(this,actionBarTitle); + + final EditText nameText = (EditText) findViewById(R.id.nameText); + final EditText usernameEditText = (EditText) findViewById(R.id.usernameText); + final EditText emailText = (EditText) findViewById(R.id.emailText); + final EditText passwordEditText = (EditText) findViewById(R.id.passwordEditText); + + final TextView createAccountTextView = (TextView) findViewById(R.id.createAccountText); + if( createAccountTextView != null ) { + createAccountTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if( nameText != null && usernameEditText != null && emailText != null && passwordEditText != null ) { + String name = nameText.getText().toString(); + String username = usernameEditText.getText().toString(); + String email = emailText.getText().toString(); + String password = passwordEditText.getText().toString(); + if(!name.isEmpty() && !username.isEmpty() && !email.isEmpty() && !password.isEmpty()) { + UsergridManager.createUserAccount(CreateAccountActivity.this,name,username,email,password); + } else { + AlertDialogHelpers.showAlert(CreateAccountActivity.this,"Error Creating Account","All fields must not be empty."); + } + } + + } + }); + } + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/FeedActivity.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/FeedActivity.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/FeedActivity.java new file mode 100644 index 0000000..4f347f8 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/FeedActivity.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.activities; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; + +import org.apache.usergrid.activityfeed.ActivityEntity; +import org.apache.usergrid.activityfeed.R; +import org.apache.usergrid.activityfeed.UsergridManager; +import org.apache.usergrid.activityfeed.callbacks.GetFeedMessagesCallback; +import org.apache.usergrid.activityfeed.callbacks.PostFeedMessageCallback; +import org.apache.usergrid.activityfeed.helpers.ActionBarHelpers; +import org.apache.usergrid.activityfeed.helpers.FeedAdapter; +import org.apache.usergrid.java.client.Usergrid; +import org.apache.usergrid.java.client.model.UsergridUser; + +import java.util.ArrayList; +import java.util.List; + +public class FeedActivity extends AppCompatActivity { + + private EditText messageET; + private ListView messagesContainer; + private FeedAdapter adapter; + private ArrayList<ActivityEntity> feedMessages; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_feed); + + final UsergridUser currentUser = Usergrid.getCurrentUser(); + String username = "Unknown"; + if( currentUser != null ) { + String currentUsername = currentUser.getUsername(); + if( currentUsername != null ) { + username = currentUser.getUsername(); + } + } + final Intent followActivityIntent = new Intent(this,FollowActivity.class); + ActionBarHelpers.setCustomViewForActionBarWithTitle(this, username + "'s feed", "Follow", new View.OnClickListener() { + @Override + public void onClick(View v) { + FeedActivity.this.startActivity(followActivityIntent); + } + }); + + initControls(); + } + + private void initControls() { + messagesContainer = (ListView) findViewById(R.id.messagesContainer); + messageET = (EditText) findViewById(R.id.messageEdit); + if(messageET != null) { + messageET.setMaxWidth(messageET.getWidth()); + } + final Button sendBtn = (Button) findViewById(R.id.chatSendButton); + if( sendBtn != null ) { + sendBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String messageText = messageET.getText().toString(); + if (TextUtils.isEmpty(messageText)) { + return; + } + + UsergridManager.postFeedMessage(messageText, new PostFeedMessageCallback() { + @Override + public void onSuccess(@NonNull ActivityEntity activityEntity) { + displayMessage(activityEntity); + } + }); + messageET.setText(""); + } + }); + } + } + + private void displayMessage(ActivityEntity message) { + adapter.add(message); + adapter.notifyDataSetChanged(); + scroll(); + } + + private void scroll() { + messagesContainer.setSelection(messagesContainer.getCount() - 1); + } + + @SuppressWarnings("unchecked") + private void loadMessages(){ + + feedMessages = new ArrayList<>(); + adapter = new FeedAdapter(FeedActivity.this, new ArrayList<ActivityEntity>()); + messagesContainer.setAdapter(adapter); + + UsergridManager.getFeedMessages(new GetFeedMessagesCallback() { + @Override + public void onResponse(@NonNull List<ActivityEntity> feedMessages) { + FeedActivity.this.feedMessages.addAll(feedMessages); + for( ActivityEntity activityEntity : FeedActivity.this.feedMessages ) { + displayMessage(activityEntity); + } + } + }); + } + + @Override + protected void onResume() { + this.loadMessages(); + super.onResume(); + } + + @Override + protected void onDestroy() { + if( Usergrid.getCurrentUser() != null ) { + UsergridManager.logoutCurrentUser(this); + } + super.onDestroy(); + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/FollowActivity.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/FollowActivity.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/FollowActivity.java new file mode 100644 index 0000000..c4aac27 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/FollowActivity.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.activities; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +import org.apache.usergrid.activityfeed.R; +import org.apache.usergrid.activityfeed.UsergridManager; +import org.apache.usergrid.activityfeed.helpers.ActionBarHelpers; +import org.apache.usergrid.activityfeed.helpers.AlertDialogHelpers; + +public class FollowActivity extends AppCompatActivity { + + private static final String actionBarTitle = "Follow"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_follow); + + ActionBarHelpers.setCustomViewForActionBarWithTitle(this,actionBarTitle); + + final EditText usernameEditText = (EditText) findViewById(R.id.followUsernameText); + final Button addFollowerButton = (Button) findViewById(R.id.addFollowerButton); + if( addFollowerButton != null ) { + addFollowerButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if( usernameEditText != null ) { + final String username = usernameEditText.getText().toString(); + if( !username.isEmpty() ) { + UsergridManager.followUser(FollowActivity.this,username); + } else { + AlertDialogHelpers.showAlert(FollowActivity.this,"Error Following User","Please enter a valid username."); + } + } + } + }); + } + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/MainActivity.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/MainActivity.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/MainActivity.java new file mode 100644 index 0000000..338f829 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/activities/MainActivity.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.activities; + +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 org.apache.usergrid.activityfeed.R; +import org.apache.usergrid.activityfeed.UsergridManager; +import org.apache.usergrid.activityfeed.helpers.AlertDialogHelpers; +import org.apache.usergrid.java.client.Usergrid; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + UsergridManager.initializeSharedInstance(this); + + final EditText usernameEditText = (EditText) findViewById(R.id.usernameText); + if( usernameEditText != null ) { + usernameEditText.setSelection(usernameEditText.getText().length()); + } + final EditText passwordEditText = (EditText) findViewById(R.id.passwordEditText); + if( passwordEditText != null ) { + passwordEditText.setSelection(passwordEditText.getText().length()); + } + + final Button signInButton = (Button) findViewById(R.id.signInButton); + if( signInButton != null ) { + signInButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if( usernameEditText != null && passwordEditText != null ) { + final String username = usernameEditText.getText().toString(); + final String password = passwordEditText.getText().toString(); + if( !username.isEmpty() && !password.isEmpty() ) { + UsergridManager.loginUser(MainActivity.this,username,password); + } else { + AlertDialogHelpers.showAlert(MainActivity.this,"Error Authenticating User","Username and password must not be empty."); + } + } + } + }); + } + + final TextView createAccountTextView = (TextView) findViewById(R.id.createAccountTextView); + if( createAccountTextView != null ) { + final Intent createAccountIntent = new Intent(this,CreateAccountActivity.class); + createAccountTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MainActivity.this.startActivity(createAccountIntent); + } + }); + } + } + + @Override + protected void onResume() { + if(Usergrid.getCurrentUser() != null) { + this.startActivity(new Intent(this,FeedActivity.class)); + } + super.onResume(); + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/callbacks/GetFeedMessagesCallback.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/callbacks/GetFeedMessagesCallback.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/callbacks/GetFeedMessagesCallback.java new file mode 100644 index 0000000..ae7b999 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/callbacks/GetFeedMessagesCallback.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.callbacks; + +import android.support.annotation.NonNull; + +import org.apache.usergrid.activityfeed.ActivityEntity; + +import java.util.List; + +public interface GetFeedMessagesCallback { + void onResponse(@NonNull final List<ActivityEntity> feedMessages); +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/callbacks/PostFeedMessageCallback.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/callbacks/PostFeedMessageCallback.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/callbacks/PostFeedMessageCallback.java new file mode 100644 index 0000000..14f5117 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/callbacks/PostFeedMessageCallback.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.callbacks; + +import android.support.annotation.NonNull; + +import org.apache.usergrid.activityfeed.ActivityEntity; + +public interface PostFeedMessageCallback { + void onSuccess(@NonNull final ActivityEntity activityEntity); +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/ActionBarHelpers.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/ActionBarHelpers.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/ActionBarHelpers.java new file mode 100644 index 0000000..46c2560 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/ActionBarHelpers.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.helpers; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.view.Gravity; +import android.view.View; +import android.widget.TextView; + +import org.apache.usergrid.activityfeed.R; + +public final class ActionBarHelpers { + private ActionBarHelpers() {} + + public static void setCustomViewForActionBarWithTitle(@NonNull final AppCompatActivity activity, @Nullable final String title) { + ActionBarHelpers.setCustomViewForActionBarWithTitle(activity,title,null,null); + } + + public static void setCustomViewForActionBarWithTitle(@NonNull final AppCompatActivity activity, @Nullable final String title, @Nullable final String rightButtonTitle, @Nullable final View.OnClickListener rightButtonOnClick) { + ActionBar actionBar = activity.getSupportActionBar(); + if( actionBar != null ) { + actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); + View actionBarView = View.inflate(activity, R.layout.action_bar_layout,null); + TextView actionBarTitleText = (TextView) actionBarView.findViewById(R.id.actionBarTitle); + actionBarTitleText.setText(title); + if( rightButtonTitle != null ) { + TextView rightTextView = (TextView) actionBarView.findViewById(R.id.buttonTitle); + rightTextView.setText(rightButtonTitle); + rightTextView.setOnClickListener(rightButtonOnClick); + } + final ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.MATCH_PARENT, Gravity.CENTER); + actionBar.setCustomView(actionBarView,params); + } + } + +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/AlertDialogHelpers.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/AlertDialogHelpers.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/AlertDialogHelpers.java new file mode 100644 index 0000000..e871271 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/AlertDialogHelpers.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.helpers; + +import android.app.Activity; +import android.content.DialogInterface; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.app.AlertDialog; +import android.view.View; +import android.widget.TextView; + +import org.apache.usergrid.activityfeed.R; + +@SuppressWarnings("unused") +public final class AlertDialogHelpers { + + private AlertDialogHelpers() {} + + public static void showAlert(@NonNull final Activity activity, @Nullable final String title, @Nullable final String message) { + AlertDialogHelpers.showAlert(activity,title,message,null); + } + + public static void showAlert(@NonNull final Activity activity, @Nullable final String title, @Nullable final String message, @Nullable final DialogInterface.OnClickListener onClickListener) { + new AlertDialog.Builder(activity) + .setTitle(title) + .setMessage(message) + .setPositiveButton(android.R.string.ok, onClickListener) + .show(); + } + + public static void showScrollableAlert(@NonNull final Activity activity, @Nullable final String title, @Nullable final String message) { + AlertDialogHelpers.showScrollableAlert(activity, title, message,null); + } + + public static void showScrollableAlert(@NonNull final Activity activity, @Nullable final String title, @Nullable final String message, @Nullable final DialogInterface.OnClickListener onClickListener) { + final View scrollableAlertView = View.inflate(activity, R.layout.scrollable_alert_view, null); + final TextView titleTextView = (TextView) scrollableAlertView.findViewById(R.id.scrollableAlertTitle); + titleTextView.setText(title); + final TextView messageTextView = (TextView) scrollableAlertView.findViewById(R.id.scrollableAlertMessage); + messageTextView.setText(message); + new AlertDialog.Builder(activity) + .setView(scrollableAlertView) + .setPositiveButton(android.R.string.ok, onClickListener) + .show(); + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/FeedAdapter.java ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/FeedAdapter.java b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/FeedAdapter.java new file mode 100644 index 0000000..53494dd --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/java/org/apache/usergrid/activityfeed/helpers/FeedAdapter.java @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.usergrid.activityfeed.helpers; + +import android.app.Activity; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import org.apache.usergrid.activityfeed.ActivityEntity; +import org.apache.usergrid.activityfeed.R; +import org.apache.usergrid.java.client.Usergrid; +import org.apache.usergrid.java.client.model.UsergridUser; + +import java.util.List; + +public class FeedAdapter extends BaseAdapter { + private final List<ActivityEntity> feedMessages; + private final Activity context; + + public FeedAdapter(Activity context, List<ActivityEntity> feedMessages) { + this.context = context; + this.feedMessages = feedMessages; + } + + @Override + public int getCount() { + if (feedMessages != null) { + return feedMessages.size(); + } else { + return 0; + } + } + + @Override + public ActivityEntity getItem(int position) { + if (feedMessages != null) { + return feedMessages.get(position); + } else { + return null; + } + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + ViewHolder holder; + ActivityEntity messageEntity = getItem(position); + if (convertView == null) { + convertView = View.inflate(context,R.layout.message_layout,null); + holder = createViewHolder(convertView); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + holder.txtMessage.setText(messageEntity.getContent()); + + boolean isMe = false; + String displayName = messageEntity.getDisplayName(); + if( displayName != null ) { + final UsergridUser currentUser = Usergrid.getCurrentUser(); + if( currentUser != null ) { + final String currentUserUsername = currentUser.getUsername(); + if( currentUserUsername != null && displayName.equalsIgnoreCase(currentUserUsername) ) { + isMe = true; + } + } + holder.txtInfo.setText(displayName); + } + setAlignment(holder,isMe); + return convertView; + } + + public void add(ActivityEntity message) { + feedMessages.add(message); + } + + private void setAlignment(ViewHolder holder, boolean isMe) { + int gravity; + int drawableResourceId; + if( !isMe ) { + gravity = Gravity.END; + drawableResourceId = R.drawable.in_message_bg; + } else { + gravity = Gravity.START; + drawableResourceId = R.drawable.out_message_bg; + } + + holder.contentWithBG.setBackgroundResource(drawableResourceId); + + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.contentWithBG.getLayoutParams(); + layoutParams.gravity = gravity; + holder.contentWithBG.setLayoutParams(layoutParams); + + RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content.getLayoutParams(); + if( !isMe ) { + lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0); + lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); + } else { + lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0); + lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); + } + + holder.content.setLayoutParams(lp); + layoutParams = (LinearLayout.LayoutParams) holder.txtMessage.getLayoutParams(); + layoutParams.gravity = gravity; + holder.txtMessage.setLayoutParams(layoutParams); + + layoutParams = (LinearLayout.LayoutParams) holder.txtInfo.getLayoutParams(); + layoutParams.gravity = gravity; + holder.txtInfo.setLayoutParams(layoutParams); + } + + private ViewHolder createViewHolder(View v) { + ViewHolder holder = new ViewHolder(); + holder.txtMessage = (TextView) v.findViewById(R.id.txtMessage); + holder.content = (LinearLayout) v.findViewById(R.id.content); + holder.contentWithBG = (LinearLayout) v.findViewById(R.id.contentWithBackground); + holder.txtInfo = (TextView) v.findViewById(R.id.txtInfo); + return holder; + } + + + private static class ViewHolder { + public TextView txtMessage; + public TextView txtInfo; + public LinearLayout content; + public LinearLayout contentWithBG; + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/in_message_bg.9.png ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/in_message_bg.9.png b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/in_message_bg.9.png new file mode 100644 index 0000000..08c6f09 Binary files /dev/null and b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/in_message_bg.9.png differ http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/out_message_bg.9.png ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/out_message_bg.9.png b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/out_message_bg.9.png new file mode 100644 index 0000000..3d511e7 Binary files /dev/null and b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/out_message_bg.9.png differ http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/usergridguy.png ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/usergridguy.png b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/usergridguy.png new file mode 100644 index 0000000..b8a6844 Binary files /dev/null and b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/drawable/usergridguy.png differ http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/action_bar_layout.xml ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/action_bar_layout.xml b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/action_bar_layout.xml new file mode 100644 index 0000000..f20a1f0 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/action_bar_layout.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="center"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:textColor="@android:color/white" + android:id="@+id/actionBarTitle" + android:textAppearance="?android:attr/textAppearanceLarge" + android:textSize="20sp" + android:gravity="center" + android:layout_centerInParent="true" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@android:color/white" + android:id="@+id/buttonTitle" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textSize="17sp" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" /> + +</RelativeLayout> http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_create_account.xml ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_create_account.xml b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_create_account.xml new file mode 100644 index 0000000..1fba8ed --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_create_account.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingBottom="@dimen/activity_vertical_margin" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + tools:context=".activities.CreateAccountActivity" + android:background="@color/lightBlue"> + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/nameText" + android:minWidth="250dp" + android:background="@android:color/white" + android:height="40dp" + android:layout_marginTop="32dp" + android:hint="Name" + android:paddingStart="10dp" + android:singleLine="true" + android:minLines="1" + android:maxLines="1" + android:minHeight="30dp" + android:layout_centerHorizontal="true" + android:inputType="textPersonName" + android:maxWidth="250dp" + android:paddingEnd="10dp" /> + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/usernameText" + android:minWidth="250dp" + android:background="@android:color/white" + android:height="40dp" + android:layout_marginTop="15dp" + android:hint="Username" + android:paddingStart="10dp" + android:singleLine="true" + android:minLines="1" + android:maxLines="1" + android:minHeight="30dp" + android:layout_below="@+id/nameText" + android:layout_centerHorizontal="true" + android:paddingEnd="10dp" + android:maxWidth="250dp" /> + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/emailText" + android:minWidth="250dp" + android:background="@android:color/white" + android:height="40dp" + android:layout_marginTop="15dp" + android:hint="Email" + android:paddingStart="10dp" + android:singleLine="true" + android:minLines="1" + android:maxLines="1" + android:minHeight="30dp" + android:layout_below="@+id/usernameText" + android:layout_centerHorizontal="true" + android:inputType="textEmailAddress" + android:paddingEnd="10dp" + android:maxWidth="250dp" /> + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/passwordEditText" + android:minWidth="250dp" + android:background="@android:color/white" + android:height="40dp" + android:layout_marginTop="15dp" + android:hint="Password" + android:paddingStart="10dp" + android:singleLine="true" + android:minLines="1" + android:maxLines="1" + android:minHeight="30dp" + android:layout_below="@+id/emailText" + android:layout_centerHorizontal="true" + android:inputType="textPassword" + android:paddingEnd="10dp" + android:maxWidth="250dp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Create Account" + android:id="@+id/createAccountText" + android:textColor="@color/colorPrimary" + android:clickable="true" + android:layout_centerVertical="true" + android:layout_centerHorizontal="true" + android:textSize="20sp" /> +</RelativeLayout> http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_feed.xml ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_feed.xml b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_feed.xml new file mode 100644 index 0000000..7e0789a --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_feed.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:background="@color/white"> + + <EditText + android:id="@+id/messageEdit" + android:layout_width="match_parent" + android:layout_height="50dp" + android:layout_alignParentBottom="true" + android:hint="Message" + android:layout_alignBottom="@+id/chatSendButton" + android:layout_toStartOf="@+id/chatSendButton" + android:paddingEnd="10dp" + android:paddingStart="10dp" /> + + <Button + android:id="@+id/chatSendButton" + android:layout_width="wrap_content" + android:layout_height="50dp" + android:layout_alignParentBottom="true" + android:layout_alignParentEnd="true" + android:background="@color/colorPrimary" + android:text="Send" + android:textColor="@color/background_material_light" + android:layout_alignParentTop="false" + android:layout_alignParentStart="false" /> + + <ListView + android:id="@+id/messagesContainer" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_alignParentStart="false" + android:layout_alignParentTop="false" + android:layout_marginBottom="50dp" + android:listSelector="@android:color/transparent" + android:transcriptMode="alwaysScroll" + android:divider="@null" + android:background="@color/switch_thumb_normal_material_light" + android:paddingBottom="10dp" + android:stackFromBottom="true" /> + +</RelativeLayout> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_follow.xml ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_follow.xml b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_follow.xml new file mode 100644 index 0000000..c70da17 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_follow.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingBottom="@dimen/activity_vertical_margin" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + tools:context=".activities.FollowActivity" + android:background="@color/lightBlue"> + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/followUsernameText" + android:minWidth="250dp" + android:background="@android:color/white" + android:height="40dp" + android:layout_marginTop="70dp" + android:hint="Username" + android:paddingStart="10dp" + android:singleLine="true" + android:minLines="1" + android:maxLines="1" + android:minHeight="30dp" + android:inputType="textPersonName" + android:layout_alignParentTop="true" + android:layout_centerHorizontal="true" + android:paddingEnd="10dp" + android:maxWidth="250dp" /> + + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Add Follower" + android:id="@+id/addFollowerButton" + android:minWidth="250dp" + android:background="@color/colorPrimary" + android:textColor="@android:color/white" + android:layout_below="@+id/followUsernameText" + android:layout_alignStart="@+id/followUsernameText" + android:layout_marginTop="30dp" /> +</RelativeLayout> http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_main.xml ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_main.xml b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..db63ae4 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/activity_main.xml @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingBottom="@dimen/activity_vertical_margin" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + tools:context=".activities.MainActivity" + android:background="@color/lightBlue"> + + <ImageView + android:layout_width="125dp" + android:layout_height="125dp" + android:id="@+id/imageView" + android:layout_alignParentTop="true" + android:layout_centerHorizontal="true" + android:src="@drawable/usergridguy" + android:layout_marginTop="20dp" + android:adjustViewBounds="true" /> + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/usernameText" + android:minWidth="250dp" + android:background="@android:color/white" + android:height="40dp" + android:layout_below="@+id/imageView" + android:layout_centerHorizontal="true" + android:layout_marginTop="30dp" + android:hint="Username" + android:paddingStart="10dp" + android:singleLine="true" + android:minLines="1" + android:maxLines="1" + android:minHeight="30dp" + android:paddingEnd="10dp" + android:maxWidth="250dp" + android:text="fc" /> + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/passwordEditText" + android:minWidth="250dp" + android:background="@android:color/white" + android:height="40dp" + android:layout_marginTop="15dp" + android:layout_below="@+id/usernameText" + android:layout_alignStart="@+id/usernameText" + android:hint="Password" + android:paddingStart="10dp" + android:singleLine="true" + android:maxLines="1" + android:minLines="1" + android:minHeight="30dp" + android:maxWidth="250dp" + android:paddingEnd="10dp" + android:inputType="textPassword" + android:text="fc" /> + + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Sign In" + android:id="@+id/signInButton" + android:layout_below="@+id/passwordEditText" + android:layout_alignEnd="@+id/passwordEditText" + android:layout_marginTop="25dp" + android:minWidth="250dp" + android:background="@color/colorPrimary" + android:textColor="@android:color/white" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Create Account" + android:id="@+id/createAccountTextView" + android:layout_below="@+id/signInButton" + android:layout_centerHorizontal="true" + android:layout_marginTop="30dp" + android:textColor="@color/colorPrimary" + android:clickable="true" /> + +</RelativeLayout> http://git-wip-us.apache.org/repos/asf/usergrid/blob/b30b60b3/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/message_layout.xml ---------------------------------------------------------------------- diff --git a/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/message_layout.xml b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/message_layout.xml new file mode 100644 index 0000000..da355b9 --- /dev/null +++ b/sdks/android/Samples/ActivityFeed/activityfeed/src/main/res/layout/message_layout.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + <LinearLayout + android:id="@+id/content" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:orientation="vertical"> + + <TextView + android:id="@+id/txtInfo" + android:layout_width="wrap_content" + android:layout_height="40sp" + android:layout_gravity="left" + android:textSize="25sp" + android:textColor="@android:color/darker_gray" + android:layout_marginTop="10dp" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" /> + + <LinearLayout + android:id="@+id/contentWithBackground" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="left" + android:background="@drawable/in_message_bg" + android:paddingLeft="10dp" + android:paddingBottom="10dp" + android:orientation="vertical"> + + <TextView + android:id="@+id/txtMessage" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@android:color/black" + android:maxWidth="240dp" /> + + </LinearLayout> + + </LinearLayout> +</RelativeLayout> \ No newline at end of file
