From 513f3bd8d96a216db29a857d75b1082abe3250a7 Mon Sep 17 00:00:00 2001 From: hussienalrubaye Date: Sun, 13 Nov 2016 15:31:12 -0500 Subject: [PATCH 01/20] android twitter app --- TwitterApp/DBScript.sql | 39 ++ TwitterApp/TwitterDem/.gitignore | 9 + TwitterApp/TwitterDem/.idea/compiler.xml | 22 + .../.idea/copyright/profiles_settings.xml | 3 + TwitterApp/TwitterDem/.idea/encodings.xml | 6 + TwitterApp/TwitterDem/.idea/gradle.xml | 19 + TwitterApp/TwitterDem/.idea/misc.xml | 49 ++ TwitterApp/TwitterDem/.idea/modules.xml | 9 + .../TwitterDem/.idea/runConfigurations.xml | 12 + TwitterApp/TwitterDem/app/.gitignore | 1 + TwitterApp/TwitterDem/app/build.gradle | 34 ++ .../TwitterDem/app/google-services.json | 125 ++++ TwitterApp/TwitterDem/app/proguard-rules.pro | 17 + .../twitterdem/ExampleInstrumentedTest.java | 26 + .../app/src/main/AndroidManifest.xml | 25 + .../com/alrubaye/twitterdem/AdapterItems.java | 27 + .../java/com/alrubaye/twitterdem/Login.java | 347 +++++++++++ .../com/alrubaye/twitterdem/MainActivity.java | 537 ++++++++++++++++++ .../com/alrubaye/twitterdem/Operations.java | 38 ++ .../com/alrubaye/twitterdem/SaveSettings.java | 41 ++ .../com/alrubaye/twitterdem/SearchType.java | 11 + .../app/src/main/res/drawable/add.png | Bin 0 -> 448 bytes .../app/src/main/res/drawable/background.xml | 18 + .../app/src/main/res/drawable/barcolor.xml | 37 ++ .../drawable/ic_account_circle_black_24dp.png | Bin 0 -> 1191 bytes .../drawable/ic_attach_file_black_24dp.png | Bin 0 -> 797 bytes .../ic_favorite_border_black_24dp.png | Bin 0 -> 1286 bytes .../main/res/drawable/ic_home_black_24dp.png | Bin 0 -> 356 bytes .../main/res/drawable/ic_home_white_24dp.png | Bin 0 -> 379 bytes .../main/res/drawable/ic_send_black_24dp.png | Bin 0 -> 543 bytes .../app/src/main/res/drawable/tweets.png | Bin 0 -> 9633 bytes .../app/src/main/res/drawable/twitter.jpg | Bin 0 -> 22954 bytes .../src/main/res/layout/activity_login.xml | 72 +++ .../app/src/main/res/layout/activity_main.xml | 149 +++++ .../app/src/main/res/layout/tweet_add.xml | 80 +++ .../app/src/main/res/layout/tweet_item.xml | 168 ++++++ .../app/src/main/res/layout/tweet_loading.xml | 13 + .../app/src/main/res/layout/tweet_msg.xml | 20 + .../app/src/main/res/menu/menu_main.xml | 21 + .../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 .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../app/src/main/res/values-w820dp/dimens.xml | 6 + .../app/src/main/res/values/colors.xml | 37 ++ .../app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 11 + .../alrubaye/twitterdem/ExampleUnitTest.java | 17 + TwitterApp/TwitterDem/build.gradle | 23 + TwitterApp/TwitterDem/gradle.properties | 17 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + TwitterApp/TwitterDem/gradlew | 160 ++++++ TwitterApp/TwitterDem/gradlew.bat | 90 +++ TwitterApp/TwitterDem/settings.gradle | 1 + TwitterApp/TwitterDemStart/.gitignore | 9 + TwitterApp/TwitterDemStart/.idea/compiler.xml | 22 + .../.idea/copyright/profiles_settings.xml | 3 + .../TwitterDemStart/.idea/encodings.xml | 6 + TwitterApp/TwitterDemStart/.idea/gradle.xml | 19 + TwitterApp/TwitterDemStart/.idea/misc.xml | 49 ++ TwitterApp/TwitterDemStart/.idea/modules.xml | 9 + .../.idea/runConfigurations.xml | 12 + TwitterApp/TwitterDemStart/app/.gitignore | 1 + TwitterApp/TwitterDemStart/app/build.gradle | 34 ++ .../TwitterDemStart/app/proguard-rules.pro | 17 + .../twitterdem/ExampleInstrumentedTest.java | 26 + .../app/src/main/AndroidManifest.xml | 24 + .../com/alrubaye/twitterdem/AdapterItems.java | 27 + .../java/com/alrubaye/twitterdem/Login.java | 99 ++++ .../com/alrubaye/twitterdem/MainActivity.java | 150 +++++ .../com/alrubaye/twitterdem/Operations.java | 38 ++ .../com/alrubaye/twitterdem/SaveSettings.java | 38 ++ .../com/alrubaye/twitterdem/SearchType.java | 11 + .../app/src/main/res/drawable/add.png | Bin 0 -> 448 bytes .../app/src/main/res/drawable/background.xml | 18 + .../app/src/main/res/drawable/barcolor.xml | 37 ++ .../drawable/ic_account_circle_black_24dp.png | Bin 0 -> 1191 bytes .../drawable/ic_attach_file_black_24dp.png | Bin 0 -> 797 bytes .../ic_favorite_border_black_24dp.png | Bin 0 -> 1286 bytes .../main/res/drawable/ic_home_black_24dp.png | Bin 0 -> 356 bytes .../main/res/drawable/ic_home_white_24dp.png | Bin 0 -> 379 bytes .../main/res/drawable/ic_send_black_24dp.png | Bin 0 -> 543 bytes .../app/src/main/res/drawable/tweets.png | Bin 0 -> 9633 bytes .../app/src/main/res/drawable/twitter.jpg | Bin 0 -> 22954 bytes .../src/main/res/layout/activity_login.xml | 72 +++ .../app/src/main/res/layout/activity_main.xml | 149 +++++ .../app/src/main/res/layout/tweet_add.xml | 80 +++ .../app/src/main/res/layout/tweet_item.xml | 168 ++++++ .../app/src/main/res/layout/tweet_loading.xml | 13 + .../app/src/main/res/layout/tweet_msg.xml | 20 + .../app/src/main/res/menu/menu_main.xml | 21 + .../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 .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../app/src/main/res/values-w820dp/dimens.xml | 6 + .../app/src/main/res/values/colors.xml | 37 ++ .../app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 11 + .../alrubaye/twitterdem/ExampleUnitTest.java | 17 + TwitterApp/TwitterDemStart/build.gradle | 23 + TwitterApp/TwitterDemStart/gradle.properties | 17 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + TwitterApp/TwitterDemStart/gradlew | 160 ++++++ TwitterApp/TwitterDemStart/gradlew.bat | 90 +++ TwitterApp/TwitterDemStart/settings.gradle | 1 + TwitterApp/TwitterServer/IsFollowing.php | 34 ++ TwitterApp/TwitterServer/Register.php | 24 + TwitterApp/TwitterServer/TweetAdd.php | 25 + TwitterApp/TwitterServer/TweetList.php | 47 ++ TwitterApp/TwitterServer/UserFollowing.php | 30 + TwitterApp/TwitterServer/login.php | 34 ++ 118 files changed, 4093 insertions(+) create mode 100644 TwitterApp/DBScript.sql create mode 100644 TwitterApp/TwitterDem/.gitignore create mode 100644 TwitterApp/TwitterDem/.idea/compiler.xml create mode 100644 TwitterApp/TwitterDem/.idea/copyright/profiles_settings.xml create mode 100644 TwitterApp/TwitterDem/.idea/encodings.xml create mode 100644 TwitterApp/TwitterDem/.idea/gradle.xml create mode 100644 TwitterApp/TwitterDem/.idea/misc.xml create mode 100644 TwitterApp/TwitterDem/.idea/modules.xml create mode 100644 TwitterApp/TwitterDem/.idea/runConfigurations.xml create mode 100644 TwitterApp/TwitterDem/app/.gitignore create mode 100644 TwitterApp/TwitterDem/app/build.gradle create mode 100644 TwitterApp/TwitterDem/app/google-services.json create mode 100644 TwitterApp/TwitterDem/app/proguard-rules.pro create mode 100644 TwitterApp/TwitterDem/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java create mode 100644 TwitterApp/TwitterDem/app/src/main/AndroidManifest.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java create mode 100644 TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Login.java create mode 100644 TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java create mode 100644 TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Operations.java create mode 100644 TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java create mode 100644 TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SearchType.java create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/add.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/background.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/barcolor.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/ic_account_circle_black_24dp.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/ic_attach_file_black_24dp.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/ic_favorite_border_black_24dp.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_black_24dp.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_white_24dp.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/ic_send_black_24dp.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/tweets.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/drawable/twitter.jpg create mode 100644 TwitterApp/TwitterDem/app/src/main/res/layout/activity_login.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/layout/activity_main.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/layout/tweet_add.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/layout/tweet_item.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/layout/tweet_loading.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/layout/tweet_msg.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/menu/menu_main.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDem/app/src/main/res/values-w820dp/dimens.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/values/colors.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/values/dimens.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/values/strings.xml create mode 100644 TwitterApp/TwitterDem/app/src/main/res/values/styles.xml create mode 100644 TwitterApp/TwitterDem/app/src/test/java/com/alrubaye/twitterdem/ExampleUnitTest.java create mode 100644 TwitterApp/TwitterDem/build.gradle create mode 100644 TwitterApp/TwitterDem/gradle.properties create mode 100644 TwitterApp/TwitterDem/gradle/wrapper/gradle-wrapper.jar create mode 100644 TwitterApp/TwitterDem/gradle/wrapper/gradle-wrapper.properties create mode 100755 TwitterApp/TwitterDem/gradlew create mode 100644 TwitterApp/TwitterDem/gradlew.bat create mode 100644 TwitterApp/TwitterDem/settings.gradle create mode 100644 TwitterApp/TwitterDemStart/.gitignore create mode 100644 TwitterApp/TwitterDemStart/.idea/compiler.xml create mode 100644 TwitterApp/TwitterDemStart/.idea/copyright/profiles_settings.xml create mode 100644 TwitterApp/TwitterDemStart/.idea/encodings.xml create mode 100644 TwitterApp/TwitterDemStart/.idea/gradle.xml create mode 100644 TwitterApp/TwitterDemStart/.idea/misc.xml create mode 100644 TwitterApp/TwitterDemStart/.idea/modules.xml create mode 100644 TwitterApp/TwitterDemStart/.idea/runConfigurations.xml create mode 100644 TwitterApp/TwitterDemStart/app/.gitignore create mode 100644 TwitterApp/TwitterDemStart/app/build.gradle create mode 100644 TwitterApp/TwitterDemStart/app/proguard-rules.pro create mode 100644 TwitterApp/TwitterDemStart/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java create mode 100644 TwitterApp/TwitterDemStart/app/src/main/AndroidManifest.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java create mode 100644 TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/Login.java create mode 100644 TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java create mode 100644 TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/Operations.java create mode 100644 TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java create mode 100644 TwitterApp/TwitterDemStart/app/src/main/java/com/alrubaye/twitterdem/SearchType.java create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/add.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/background.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/barcolor.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_account_circle_black_24dp.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_attach_file_black_24dp.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_favorite_border_black_24dp.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_home_black_24dp.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_home_white_24dp.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/ic_send_black_24dp.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/tweets.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/drawable/twitter.jpg create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/layout/activity_login.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/layout/activity_main.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_add.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_item.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_loading.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/layout/tweet_msg.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/menu/menu_main.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/values-w820dp/dimens.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/values/colors.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/values/dimens.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/values/strings.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/main/res/values/styles.xml create mode 100644 TwitterApp/TwitterDemStart/app/src/test/java/com/alrubaye/twitterdem/ExampleUnitTest.java create mode 100644 TwitterApp/TwitterDemStart/build.gradle create mode 100644 TwitterApp/TwitterDemStart/gradle.properties create mode 100644 TwitterApp/TwitterDemStart/gradle/wrapper/gradle-wrapper.jar create mode 100644 TwitterApp/TwitterDemStart/gradle/wrapper/gradle-wrapper.properties create mode 100755 TwitterApp/TwitterDemStart/gradlew create mode 100644 TwitterApp/TwitterDemStart/gradlew.bat create mode 100644 TwitterApp/TwitterDemStart/settings.gradle create mode 100644 TwitterApp/TwitterServer/IsFollowing.php create mode 100644 TwitterApp/TwitterServer/Register.php create mode 100644 TwitterApp/TwitterServer/TweetAdd.php create mode 100644 TwitterApp/TwitterServer/TweetList.php create mode 100644 TwitterApp/TwitterServer/UserFollowing.php create mode 100644 TwitterApp/TwitterServer/login.php diff --git a/TwitterApp/DBScript.sql b/TwitterApp/DBScript.sql new file mode 100644 index 000000000000..7d3572311151 --- /dev/null +++ b/TwitterApp/DBScript.sql @@ -0,0 +1,39 @@ +drop database twitter; +create database twitter; +use twitter; + +create table login( + user_id int AUTO_INCREMENT PRIMARY KEY, + first_name varchar(50), + email varchar(50), + password varchar(50), + picture_path varchar(350) + ); +describe login; + +create table following( + user_id int , + following_user_id int, + FOREIGN KEY (user_id) REFERENCES login(user_id), + FOREIGN KEY (following_user_id) REFERENCES login(user_id) + ); +describe following; + +create table tweets( + tweet_id int AUTO_INCREMENT PRIMARY KEY, + user_id int , + tweet_text varchar(50), + tweet_picture varchar(350), + tweet_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES login(user_id) + ); +describe tweets; + +CREATE VIEW user_tweets AS +SELECT tweets.tweet_id ,tweets.tweet_text,tweets.tweet_picture, +tweets.tweet_date,tweets.user_id,login.first_name,login.picture_path +FROM tweets +inner join login +on tweets.user_id =login.user_id; +describe user_tweets; + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.gitignore b/TwitterApp/TwitterDem/.gitignore new file mode 100644 index 000000000000..39fb081a42a8 --- /dev/null +++ b/TwitterApp/TwitterDem/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/TwitterApp/TwitterDem/.idea/compiler.xml b/TwitterApp/TwitterDem/.idea/compiler.xml new file mode 100644 index 000000000000..96cc43efa6a0 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/copyright/profiles_settings.xml b/TwitterApp/TwitterDem/.idea/copyright/profiles_settings.xml new file mode 100644 index 000000000000..e7bedf3377d4 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/encodings.xml b/TwitterApp/TwitterDem/.idea/encodings.xml new file mode 100644 index 000000000000..97626ba45445 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/gradle.xml b/TwitterApp/TwitterDem/.idea/gradle.xml new file mode 100644 index 000000000000..0e23f8edad75 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/misc.xml b/TwitterApp/TwitterDem/.idea/misc.xml new file mode 100644 index 000000000000..84cfd6708077 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/misc.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/modules.xml b/TwitterApp/TwitterDem/.idea/modules.xml new file mode 100644 index 000000000000..2bc9a4255897 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/.idea/runConfigurations.xml b/TwitterApp/TwitterDem/.idea/runConfigurations.xml new file mode 100644 index 000000000000..7f68460d8b38 --- /dev/null +++ b/TwitterApp/TwitterDem/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/.gitignore b/TwitterApp/TwitterDem/app/.gitignore new file mode 100644 index 000000000000..796b96d1c402 --- /dev/null +++ b/TwitterApp/TwitterDem/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/TwitterApp/TwitterDem/app/build.gradle b/TwitterApp/TwitterDem/app/build.gradle new file mode 100644 index 000000000000..8d0f545bf74c --- /dev/null +++ b/TwitterApp/TwitterDem/app/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.0" + defaultConfig { + applicationId "com.alrubaye.twitterdem" + minSdkVersion 12 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:25.0.0' + testCompile 'junit:junit:4.12' + compile 'com.google.firebase:firebase-core:9.6.1' + compile 'com.google.firebase:firebase-storage:9.6.1' + compile 'com.google.firebase:firebase-auth:9.6.1' + compile 'com.squareup.picasso:picasso:2.5.2' +} +apply plugin: 'com.google.gms.google-services' diff --git a/TwitterApp/TwitterDem/app/google-services.json b/TwitterApp/TwitterDem/app/google-services.json new file mode 100644 index 000000000000..cc9148e82ceb --- /dev/null +++ b/TwitterApp/TwitterDem/app/google-services.json @@ -0,0 +1,125 @@ +{ + "project_info": { + "project_number": "21845150751", + "firebase_url": "https://firbasedemo-6228f.firebaseio.com", + "project_id": "firbasedemo-6228f", + "storage_bucket": "firbasedemo-6228f.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:21845150751:android:8592e90db472ebb7", + "android_client_info": { + "package_name": "com.hussienalrubaye.androidfirebase" + } + }, + "oauth_client": [ + { + "client_id": "21845150751-tiq6jqsk2ndfvlvgtnlc659jsakg5csn.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.hussienalrubaye.androidfirebase", + "certificate_hash": "76A07B52241638F10FB6D3CF8F6B855F929169DC" + } + }, + { + "client_id": "21845150751-m2e88crhtgshikohp6jmeln4o4ut014k.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBrmRClRWJF_SsRTnHUCufUo6808FJFa7I" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 2, + "other_platform_oauth_client": [ + { + "client_id": "21845150751-m2e88crhtgshikohp6jmeln4o4ut014k.apps.googleusercontent.com", + "client_type": 3 + } + ] + }, + "ads_service": { + "status": 2 + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:21845150751:android:679da90dbe15c5b2", + "android_client_info": { + "package_name": "com.alrubye.firstapp" + } + }, + "oauth_client": [ + { + "client_id": "21845150751-5tk4fg7c1k9l81ll5q8lihmtnp1olt0c.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.alrubye.firstapp", + "certificate_hash": "76A07B52241638F10FB6D3CF8F6B855F929169DC" + } + }, + { + "client_id": "21845150751-m2e88crhtgshikohp6jmeln4o4ut014k.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBrmRClRWJF_SsRTnHUCufUo6808FJFa7I" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:21845150751:android:3162a499db69de48", + "android_client_info": { + "package_name": "com.alrubaye.twitterdem" + } + }, + "oauth_client": [ + { + "client_id": "21845150751-m2e88crhtgshikohp6jmeln4o4ut014k.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBrmRClRWJF_SsRTnHUCufUo6808FJFa7I" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/proguard-rules.pro b/TwitterApp/TwitterDem/app/proguard-rules.pro new file mode 100644 index 000000000000..c0625ce1e770 --- /dev/null +++ b/TwitterApp/TwitterDem/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/hussienalrubaye/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/TwitterApp/TwitterDem/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java b/TwitterApp/TwitterDem/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java new file mode 100644 index 000000000000..37deba417ec4 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/androidTest/java/com/alrubaye/twitterdem/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.alrubaye.twitterdem; + +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.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.alrubaye.twitterdem", appContext.getPackageName()); + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/AndroidManifest.xml b/TwitterApp/TwitterDem/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..d4bcc45e3f0d --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java new file mode 100644 index 000000000000..f0e468343362 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/AdapterItems.java @@ -0,0 +1,27 @@ +package com.alrubaye.twitterdem; + +/** + * Created by hussienalrubaye on 11/13/16. + */ + +public class AdapterItems { + public String tweet_id; + public String tweet_text; + public String tweet_picture; + public String tweet_date; + public String user_id; + public String first_name; + public String picture_path; + //for news details + AdapterItems( String tweet_id, String tweet_text,String tweet_picture, + String tweet_date,String user_id,String first_name ,String picture_path) + { + this. tweet_id=tweet_id; + this. tweet_text=tweet_text; + this. tweet_picture=tweet_picture; + this. user_id=user_id; + this. first_name=first_name; + this. picture_path=picture_path; + this.tweet_date=tweet_date; + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Login.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Login.java new file mode 100644 index 000000000000..4c1213e9b0bf --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Login.java @@ -0,0 +1,347 @@ +package com.alrubaye.twitterdem; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; +import android.support.v4.app.ActivityCompat; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Toast; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.StorageReference; +import com.google.firebase.storage.UploadTask; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Login extends AppCompatActivity { +EditText etName; + EditText etEmail; + EditText etPassword; + ImageView ivUserImage; + int RESULT_LOAD_IMAGE=111; //any number for tag + //1- define + private static final String TAG = "AnonymousAuth"; + + // [START declare_auth] + private FirebaseAuth mAuth; + // [END declare_auth] + + // [START declare_auth_listener] + private FirebaseAuth.AuthStateListener mAuthListener; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + etName=(EditText)findViewById(R.id.etName); + etEmail=(EditText)findViewById(R.id.etEmail); + etPassword=(EditText)findViewById(R.id.etPassword); + ivUserImage=(ImageView) findViewById(R.id.ivUserImage); + ivUserImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + CheckUserPermsions(); + } + }); + + //2- initiailze OnCreate() + // [START initialize_auth] + mAuth = FirebaseAuth.getInstance(); + // [END initialize_auth] + + // [START auth_state_listener] + mAuthListener = new FirebaseAuth.AuthStateListener() { + @Override + public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { + FirebaseUser user = firebaseAuth.getCurrentUser(); + if (user != null) { + // User is signed in + Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); + } else { + // User is signed out + Log.d(TAG, "onAuthStateChanged:signed_out"); + } + + } + }; + } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { + Uri selectedImage = data.getData(); + String[] filePathColumn = {MediaStore.Images.Media.DATA}; + + Cursor cursor = getContentResolver().query(selectedImage, + filePathColumn, null, null, null); + cursor.moveToFirst(); + + int columnIndex = cursor.getColumnIndex(filePathColumn[0]); + String picturePath = cursor.getString(columnIndex); + cursor.close(); + ivUserImage.setImageBitmap(BitmapFactory.decodeFile(picturePath)); + + } + } + + public void buLogin(View view) { + showProgressDialog(); + FirebaseStorage storage=FirebaseStorage.getInstance(); + // Create a storage reference from our app + StorageReference storageRef = storage.getReferenceFromUrl("gs://firbasedemo-6228f.appspot.com"); + DateFormat df = new SimpleDateFormat("ddMMyyHHmmss"); + Date dateobj = new Date(); + // System.out.println(df.format(dateobj)); +// Create a reference to "mountains.jpg" + final String ImagePath= df.format(dateobj) +".jpg"; + StorageReference mountainsRef = storageRef.child("images/"+ ImagePath); + ivUserImage.setDrawingCacheEnabled(true); + ivUserImage.buildDrawingCache(); + // Bitmap bitmap = imageView.getDrawingCache(); + BitmapDrawable drawable=(BitmapDrawable)ivUserImage.getDrawable(); + Bitmap bitmap =drawable.getBitmap(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); + byte[] data = baos.toByteArray(); + + UploadTask uploadTask = mountainsRef.putBytes(data); + uploadTask.addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception exception) { + // Handle unsuccessful uploads + } + }).addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { + // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL. + String downloadUrl = taskSnapshot.getDownloadUrl().toString(); + String name=""; + try { + //for space with name + name = java.net.URLEncoder.encode( etName.getText().toString() , "UTF-8"); + downloadUrl= java.net.URLEncoder.encode(downloadUrl , "UTF-8"); + } catch (UnsupportedEncodingException e) { + + } + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/register.php?first_name="+name+"&email="+etEmail.getText().toString()+"&password="+etPassword.getText().toString()+"&picture_path="+ downloadUrl; + + new MyAsyncTaskgetNews().execute(url); + + } + }); + } + + // get news from server + public class MyAsyncTaskgetNews extends AsyncTask { + @Override + protected void onPreExecute() { + //before works + } + @Override + protected String doInBackground(String... params) { + // TODO Auto-generated method stub + try { + String NewsData; + //define the url we have to connect with + URL url = new URL(params[0]); + //make connect with url and send request + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + //waiting for 7000ms for response + urlConnection.setConnectTimeout(7000);//set timeout to 5 seconds + + try { + //getting the response data + InputStream in = new BufferedInputStream(urlConnection.getInputStream()); + //convert the stream to string + Operations operations=new Operations(getApplicationContext()); + NewsData = operations.ConvertInputToStringNoChange(in); + //send to display data + publishProgress(NewsData); + } finally { + //end connection + urlConnection.disconnect(); + } + + }catch (Exception ex){} + return null; + } + protected void onProgressUpdate(String... progress) { + + try { + JSONObject json= new JSONObject(progress[0]); + //display response data + if (json.getString("msg")==null) + return; + if (json.getString("msg").equalsIgnoreCase("user is added")) { + Toast.makeText(getApplicationContext(), json.getString("msg"), Toast.LENGTH_LONG).show(); +//login + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/login.php?email="+etEmail.getText().toString()+"&password="+etPassword.getText().toString() ; + + new MyAsyncTaskgetNews().execute(url); + } + + if (json.getString("msg").equalsIgnoreCase("Pass Login")) { + JSONArray UserInfo=new JSONArray( json.getString("info")); + JSONObject UserCreintal= UserInfo.getJSONObject(0); + //Toast.makeText(getApplicationContext(),UserCreintal.getString("user_id"),Toast.LENGTH_LONG).show(); + hideProgressDialog(); + SaveSettings saveSettings= new SaveSettings(getApplicationContext()); + saveSettings.SaveData(UserCreintal.getString("user_id")); + finish(); //close this activity + } + + } catch (Exception ex) { + Log.d("er", ex.getMessage()); + } + + + } + + protected void onPostExecute(String result2){ + + + } + + + + + } + + // [START on_start_add_listener] + @Override + public void onStart() { + super.onStart(); + mAuth.addAuthStateListener(mAuthListener); + signInAnonymously(); + } + // [END on_start_add_listener] + + // [START on_stop_remove_listener] + @Override + public void onStop() { + super.onStop(); + if (mAuthListener != null) { + mAuth.removeAuthStateListener(mAuthListener); + } + hideProgressDialog(); + } + private void signInAnonymously() { + // [START signin_anonymously] + mAuth.signInAnonymously() + .addOnCompleteListener(this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + Log.d(TAG, "signInAnonymously:onComplete:" + task.isSuccessful()); + + // If sign in fails, display a message to the user. If sign in succeeds + // the auth state listener will be notified and logic to handle the + // signed in user can be handled in the listener. + if (!task.isSuccessful()) { + Log.w(TAG, "signInAnonymously", task.getException()); + + } + + } + }); + // [END signin_anonymously] + } + + + @VisibleForTesting + public ProgressDialog mProgressDialog; + + public void showProgressDialog() { + if (mProgressDialog == null) { + mProgressDialog = new ProgressDialog(this); + mProgressDialog.setMessage("loading"); + mProgressDialog.setIndeterminate(true); + } + + mProgressDialog.show(); + } + + public void hideProgressDialog() { + if (mProgressDialog != null && mProgressDialog.isShowing()) { + mProgressDialog.dismiss(); + } + } + + + void CheckUserPermsions(){ + if ( Build.VERSION.SDK_INT >= 23){ + if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != + PackageManager.PERMISSION_GRANTED ){ + requestPermissions(new String[]{ + android.Manifest.permission.READ_EXTERNAL_STORAGE}, + REQUEST_CODE_ASK_PERMISSIONS); + return ; + } + } + + LoadImage();// init the contact list + + } + //get acces to location permsion + final private int REQUEST_CODE_ASK_PERMISSIONS = 123; + + + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + switch (requestCode) { + case REQUEST_CODE_ASK_PERMISSIONS: + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + LoadImage();// init the contact list + } else { + // Permission Denied + Toast.makeText( this,"your message" , Toast.LENGTH_SHORT) + .show(); + } + break; + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + + void LoadImage(){ + Intent i = new Intent( + Intent.ACTION_PICK, + android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + + startActivityForResult(i, RESULT_LOAD_IMAGE); + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java new file mode 100644 index 000000000000..b01021be377e --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/MainActivity.java @@ -0,0 +1,537 @@ +package com.alrubaye.twitterdem; + +import android.app.ProgressDialog; +import android.app.SearchManager; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.AsyncTask; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.BaseAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; +import android.widget.SearchView; + +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.StorageReference; +import com.google.firebase.storage.UploadTask; +import com.squareup.picasso.Picasso; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +public class MainActivity extends AppCompatActivity { + //adapter class + ArrayList listnewsData = new ArrayList(); + MyCustomAdapter myadapter; + int totalItemCountVisible=0; //totalItems visible + LinearLayout ChannelInfo; + TextView txtnamefollowers; + int SelectedUserID=0; + Button buFollow; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + ChannelInfo=(LinearLayout)findViewById(R.id.ChannelInfo) ; + ChannelInfo.setVisibility(View.GONE); + txtnamefollowers=(TextView)findViewById(R.id.txtnamefollowers) ; + buFollow=(Button)findViewById(R.id.buFollow); + SaveSettings saveSettings= new SaveSettings(getApplicationContext()); + saveSettings.LoadData(); + + //add data and view it + // listnewsData.add(new AdapterItems( null, null,null,"add",null,null ,null)); + myadapter=new MyCustomAdapter(this,listnewsData); + ListView lsNews=(ListView)findViewById(R.id.LVNews); + lsNews.setAdapter(myadapter);//intisal with data + LoadTweets(0,SearchType.MyFollowing); + // list view scrool + lsNews.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { +// scroll up loading + + + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + //firstVisibleItem it have been seen + //visibleItemCount visible now + totalItemCountVisible=firstVisibleItem + visibleItemCount; + if(totalItemCountVisible== totalItemCount) + { + + if (listnewsData.size()>5) + if (!listnewsData.get(listnewsData.size()-1).tweet_date.equals("loading") + && !listnewsData.get(0).tweet_date.equals("loading")) + LoadTweets(listnewsData.size()-1,UserOperation); + + } + + + } + }); + + + } + + public void buFollowers(View view) { + + int Operation; // 1- subsribe 2- unsubscribe + String Follow=buFollow.getText().toString(); + if (Follow.equalsIgnoreCase("Follow")) { + Operation = 1; + buFollow.setText("Un Follow"); + } + else { + Operation = 2; + buFollow.setText("Follow"); + } + + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/userfollowing.php?user_id="+SaveSettings.UserID +"&following_user_id="+SelectedUserID+"&op="+ Operation; + new MyAsyncTaskgetNews().execute(url); + + } + + + private class MyCustomAdapter extends BaseAdapter { + public ArrayList listnewsDataAdpater ; +Context context; + public MyCustomAdapter(Context context,ArrayList listnewsDataAdpater) { + this.listnewsDataAdpater=listnewsDataAdpater; + this.context=context; + } + + + @Override + public int getCount() { + return listnewsDataAdpater.size(); + } + + @Override + public String getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) + { + + final AdapterItems s = listnewsDataAdpater.get(position); + + if(s.tweet_date.equals("add")) { + LayoutInflater mInflater = getLayoutInflater(); + View myView = mInflater.inflate(R.layout.tweet_add, null); + + final EditText etPost = (EditText) myView.findViewById(R.id.etPost); + ImageView iv_post=(ImageView) myView.findViewById(R.id.iv_post) ; + + + ImageView iv_attach=(ImageView) myView.findViewById(R.id.iv_attach) ; + iv_attach.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + LoadImage(); + } + }); + iv_post.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String tweets=null; + try { + //for space with name + tweets = java.net.URLEncoder.encode( etPost.getText().toString() , "UTF-8"); + downloadUrl= java.net.URLEncoder.encode(downloadUrl , "UTF-8"); + } catch (UnsupportedEncodingException e) { + tweets="."; + } + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/tweetadd.php?user_id="+ SaveSettings.UserID +"&tweet_text="+ tweets +"&tweet_picture="+ downloadUrl; + new MyAsyncTaskgetNews().execute(url); + etPost.setText(""); + + } + }); + + return myView; + } + else if(s.tweet_date.equals("loading")) { + LayoutInflater mInflater = getLayoutInflater(); + View myView = mInflater.inflate(R.layout.tweet_loading, null); + return myView; + } + else if(s.tweet_date.equals("notweet")) { + LayoutInflater mInflater = getLayoutInflater(); + View myView = mInflater.inflate(R.layout.tweet_msg, null); + return myView; + } + + + else { + LayoutInflater mInflater = getLayoutInflater(); + View myView = mInflater.inflate(R.layout.tweet_item, null); + + TextView txtUserName = (TextView) myView.findViewById(R.id.txtUserName); + txtUserName.setText(s.first_name); + txtUserName.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + LoadTweets(0,SearchType.OnePerson); + txtnamefollowers.setText(s.first_name); + SelectedUserID=Integer.parseInt(s.user_id); + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/isfollowing.php?user_id="+SaveSettings.UserID +"&following_user_id="+SelectedUserID; + new MyAsyncTaskgetNews().execute(url); + + } + }); + TextView txt_tweet = (TextView) myView.findViewById(R.id.txt_tweet); + txt_tweet.setText(s.tweet_text); + + TextView txt_tweet_date = (TextView) myView.findViewById(R.id.txt_tweet_date); + txt_tweet_date.setText(s.tweet_date); + + ImageView tweet_picture=(ImageView)myView.findViewById(R.id.tweet_picture); + Picasso.with(context).load(s.tweet_picture).into(tweet_picture); + ImageView picture_path=(ImageView)myView.findViewById(R.id.picture_path); + Picasso.with(context).load(s.picture_path).into(picture_path); + return myView; + } + } + + } + + + // get news from server + public class MyAsyncTaskgetNews extends AsyncTask { + @Override + protected void onPreExecute() { + //before works + } + @Override + protected String doInBackground(String... params) { + // TODO Auto-generated method stub + try { + String NewsData; + //define the url we have to connect with + URL url = new URL(params[0]); + //make connect with url and send request + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + //waiting for 7000ms for response + urlConnection.setConnectTimeout(7000);//set timeout to 5 seconds + + try { + //getting the response data + InputStream in = new BufferedInputStream(urlConnection.getInputStream()); + //convert the stream to string + Operations operations=new Operations(getApplicationContext()); + NewsData = operations.ConvertInputToStringNoChange(in); + //send to display data + publishProgress(NewsData); + } finally { + //end connection + urlConnection.disconnect(); + } + + }catch (Exception ex){} + return null; + } + protected void onProgressUpdate(String... progress) { + + + try { + JSONObject json= new JSONObject(progress[0]); + //display response data + if (json.getString("msg")==null) + return; + + if (json.getString("msg").equalsIgnoreCase("tweet is added")) { + LoadTweets(1,UserOperation); + } + else if (json.getString("msg").equalsIgnoreCase("has tweet")) { + if(StartFrom==0) { + listnewsData.clear(); + listnewsData.add(new AdapterItems(null, null, null, + "add", null, null, null)); + + } + else { + //remove we are loading now + listnewsData.remove(listnewsData.size()-1); + } + JSONArray tweets=new JSONArray( json.getString("info")); + + for (int i = 0; i () { + @Override + public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { + // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL. + downloadUrl = taskSnapshot.getDownloadUrl().toString(); + hideProgressDialog(); + } + }); + } + + + + + protected void onResume(){ + super.onResume(); + // LoadTweets(); + } + int StartFrom=0; + int UserOperation=SearchType.MyFollowing; // 0 my followers post 2- specifc user post 3- search post + String Searchquery; + void LoadTweets(int StartFrom,int UserOperation){ + this.StartFrom=StartFrom; + this.UserOperation=UserOperation; + //display loading + if(StartFrom==0) // add loading at beggining + listnewsData.add(0,new AdapterItems(null, null, null, + "loading", null, null, null)); + else // add loading at end + listnewsData.add(new AdapterItems(null, null, null, + "loading", null, null, null)); + + myadapter.notifyDataSetChanged(); + + + String url="http://10.0.2.2/~hussienalrubaye/twitterserver/tweetlist.php?user_id="+ SaveSettings.UserID + "&StartFrom="+StartFrom + "&op="+ UserOperation; + if (UserOperation==3) + url="http://10.0.2.2/~hussienalrubaye/twitterserver/tweetlist.php?user_id="+ SaveSettings.UserID + "&StartFrom="+StartFrom + "&op="+ UserOperation + "&query="+ Searchquery; + + new MyAsyncTaskgetNews().execute(url); + + if (UserOperation==SearchType.OnePerson) + ChannelInfo.setVisibility(View.VISIBLE); + else + ChannelInfo.setVisibility(View.GONE); + + + } + +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Operations.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Operations.java new file mode 100644 index 000000000000..ad1aaf6c32a2 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/Operations.java @@ -0,0 +1,38 @@ +package com.alrubaye.twitterdem; + +import android.content.Context; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * Created by hussienalrubaye on 11/13/16. + */ + +public class Operations { + Context context; + public Operations(Context context){ + this.context=context; + } + // this method convert any stream to string + public static String ConvertInputToStringNoChange(InputStream inputStream) { + + BufferedReader bureader=new BufferedReader( new InputStreamReader(inputStream)); + String line ; + String linereultcal=""; + + try{ + while((line=bureader.readLine())!=null) { + + linereultcal+=line; + + } + inputStream.close(); + + + }catch (Exception ex){} + + return linereultcal; + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java new file mode 100644 index 000000000000..3544ed2b970a --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SaveSettings.java @@ -0,0 +1,41 @@ +package com.alrubaye.twitterdem; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; + +/** + * Created by hussienalrubaye on 11/13/16. + */ + +public class SaveSettings { + public static String UserID=""; + //https://firebasestorage.googleapis.com/v0/b/firbasedemo-6228f.appspot.com/o/images%2F32_131116124812.jpg?alt=media&token=0287e868-557b-431c-bccc-7245d5fe8fc6 + public static String ServerImages=""; + + + Context context; + SharedPreferences ShredRef; + public SaveSettings(Context context){ + this.context=context; + ShredRef=context.getSharedPreferences("myRef",Context.MODE_PRIVATE); + } + + void SaveData(String UserID){ + + SharedPreferences.Editor editor=ShredRef.edit(); + editor.putString("UserID",UserID); + editor.commit(); + } + + void LoadData(){ + UserID= ShredRef.getString("UserID","0"); + if (UserID.equals("0")){ + + Intent intent=new Intent(context, Login.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + } +} diff --git a/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SearchType.java b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SearchType.java new file mode 100644 index 000000000000..287ffaa04588 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/java/com/alrubaye/twitterdem/SearchType.java @@ -0,0 +1,11 @@ +package com.alrubaye.twitterdem; + +/** + * Created by hussienalrubaye on 11/13/16. + */ + +public class SearchType { + public static int MyFollowing=1; + public static int OnePerson=2; + public static int SearchIn=3; +} diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/add.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/add.png new file mode 100644 index 0000000000000000000000000000000000000000..d32de2967e8454ea5a9d0ad100ca5d5751411d34 GIT binary patch literal 448 zcmV;x0YCnUP)%kivVg=X7xzraN83B&U%6P) z)6=Ix1IK$mC89Yq&j9H6eIs6qNM(%qB%%*%ZPjN6T^HW_2{W$&WJ3;wI}zC$V_vMa z$F}?*fX!y}XpHehG&#q3By(hDyId}JvEDC$JkK)#YW(UWB6hJ@Y=eOlK;!xQ)s`bg zW_}7xY59`IqC0#fHM415CUK%b9i-=@{D>HyJ3rOe9*p3J)Zva+jE&VuyTEfh% qjAkM-4MVZ+P@oc#ojzTLo-IG~nf8~5^rp!G0000 + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/barcolor.xml b/TwitterApp/TwitterDem/app/src/main/res/drawable/barcolor.xml new file mode 100644 index 000000000000..1f6177139f47 --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/res/drawable/barcolor.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_account_circle_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_account_circle_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b56c3443bcca464424169e56002ec3d21392cf GIT binary patch literal 1191 zcmV;Y1X%ltP)uT2q|HPND1T4H2KW^O8l zHWc4x;=_z6OUV}&gC%3T=TwrZsdGBY@oTTebI$cU=eo{r@O-}iz|PHe{dS!PEJ`F2 zi9}*Nbu@99^K{V1AVb3q(nkkv9HNOj#!-~=)YC#2Vo)c|EGI{iNK?lN9wEvGIL;E% zjHn74=|Lh?U^C^6h#cGb2eHr{wvr`gYq)_}td|C2GmUeIgHAJ*7_6foanya*;8cch z5y!Pqh9l$o9f_gesKS96^dK?S#miXsDt{v}c9U6HG(-L8ce8^UCQ>@wL~7VcL466+ zv1EdB@f27|nx~~%#Wm$Zs=|Vda_b%?hnGC9h@y*>5!pA0qTK}f98q+Th}J28{a`7M zA&S-#!8H0+Yd?pHa(WTt9#BnK$}`VOOs!U)kwRLd9Gq!Pl_=+01A63?2j(4U>{1@K zv#4!DRMnud7*X{;N)_BiR82%c~lw^Wu<70LX>R+oNY4q7oZyw)FFuLC8Vwv zVqzegE4|z;f za2*NNUlhXt3DkiUaqR@^LyEXt1R6w&xB&tUAw}Gi z=ima0dxeFJdA6MwjrUr$M3 z2+_w?cCe5VOuWFGd_pIpj|27(bNzh9Ji?gI0rkRaw0oSsO%tPuVhr23Yxl{-IOB=D zn-{U+CH636?}i4W)!E4#*tCFdTepo*R6DOZybB5Pd8`Je!Y83lY!W!dRLD;!y=IjrMtOpF&|X z;?a6s+JJbp5tVZ8cy8j?aAgjUk!RLN4yCO=?@B6hp^6^=GmuW!=P}eJ^4M0+WuM2! z8T4pCJo||}HdXKo;@Jv9I*oXCiK>{s#yd%9Q+@BAx_KQN=F;PPmp28#&G!U|DA-!LBzLn%p|PY{D}DWHIbEZ5%KL`_A&vjNqotFh;J7t#eyojkboZ3!W_k_ zKg^)PP19H`na)kbpg;MDxuo$@!aP2v9Wm$z)mSu(n~IOb+Sto`)U${M!!4qo4eX^& z@d4X)W@6cNx{;Xbq#6gtaS@533yj5)G7ce*+fOM@t>ppYsCzUJgKADA4m!ycV$(n` zVzB}%h*_2oxQ$q-k47?#h&-Dj4%aR=l4C@rsil>Nh_Zf;QbUR&k!2bCxr!Ln!9JFf zp(s_cm@PDOmUeD2z?0zyxJ5f>I6xz{RFX&}5{ZO0{{y$=Uc`XizSIB!002ovPDHLk FV1laoD_Z~n literal 0 HcmV?d00001 diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_attach_file_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_attach_file_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..620226d320930211d63fe5709f2bb3eed650a6cd GIT binary patch literal 797 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7!1Tn^#WAFU@$Ibp-ob$~2kbd# zZ_E5D;H;w(SpE9C^8@<{7o9Utp9#$GWV03j5jG|8p>v?i27x6njw=~3DgI(+l6O&_ zEV?47c*=r%iSaQ> zbua$XKf-U)X0WLB@2_y+4%<9au`Zcw#xph32rupThI(@rNpf2rDDUy!zmflRM(OsN zi5GfYS&Gd3CkY-hd35@Q$BcHBVzVILYX&WaKU&x}-E`!6{GrX3eYs6#nC0=PIq9ME zJhtU5PV6yw|H-vU&~0Obu8Pd;&)E{u$8R3eEvRX8oa40oVn(SC|5+sxcP8Hf zG8YhsCWu{c_Q*OqcgkMI&yRius?2?KZq8mt{Ucv9w|$zPTO(4Q^o?!KK?@o*S?1DL&G1BEZq(jL7n&6UiSHUN1ab_$I6;{L#j}Yuf7!FKdWC z-t}95x%ZD%RTH`jU2Mua8J-HIM4q|gca&q3l3dNSqL;#(RX741pRE4h(qHt!c=le= zy*FLjxThRuI5wM?WkY9q-}U|NK{x$_&KNizwQLkTC$LE5)y%^j)*l+oB_5`5a(?wm zY)P(g;`WZrPh5Zc?BhSL^)I!!e@T#8S0E_g`oY-2C_6-4u1Iw9Q=YvnC*3F5r5Q%X z9ZP(8k312Im zA`|VTvQ4phMsk-Y5M1vft}Pw`)lP PlRbl{tDnm{r-UW|iB(ts literal 0 HcmV?d00001 diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_favorite_border_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_favorite_border_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..96e0b9e76065db0e640794394975f5a665d40711 GIT binary patch literal 1286 zcmV+h1^N1kP)VBAk?%CCUI1x@e|>g^VFi0xY4G zK{PoSWCzR0z(^)f&@oJ%i!}2HejMdz1xL|L#3`!DLIye1&||935h@sgLyFmtW+6^c zj^uGpTB`FCVQlkJ#UPsHXd=W=<7kbc%0<@T!-fEx&|-|=xq~ah9E-WmM+9OYzZuO& z^icx9e9qgd(?oz6_}GMIGcGWP68de|`4AtLtwj@~pDk1pCP)B3A?{)opI>#zbDX>C zAGh^#9X|nrgjvbftJZl5i;5W($EhVBNj_`oK{FYrSi=}3LF(uem-9?4@QWK~8xt5# zF7I*4aQI8SLpH;?j_pF;UPfTr3ZXzFK8!8k%&_DC&0LJ7@wSk=9FqbZ6~;HKh(FPg z;}}ygYrT?v7(b>g5q>;A%)1SF;hy1U%uAzPsjwJRT9u_c0c)0`39$%kuIIdRMKB>x z*?(%Wu1OjHW2}2k*^6>9RI2Rz`B+z^s}kiVtP3%qtMed+8g(gKh|Mxy7!peX9QaSx zW2i-!Qi+?Mv%U(tbtz%oRIHokAci8klpt;ztDB|=Bg(P~;HGqCOEDDHrDWiyOywTd zh;lD@EpD2io8}~jj_6Wm;-;`}nl23O)TLD5rb^v3tr&V=m+}E_+NhhR0YgvfQX=?q zOS+TCG9DAUbV<#)rA;@!Yjtv zSk$7F=pu_m$l;I^+sI@tC}lR12%D9@=P4itRcK1QNW8r)bX`qM{Ol3FMb0Ch77$f> zen}cJnk>BPKFck{%M5yze!Uc8L%H~hwt#pj|F*a=wivB`AP785B=(HZ&()n5_ z{5?51>3?(zU3TNg0prB4^t%{^Q%3WR(BU^iIAl6!g$C_pIyC-Hp?ZWVIA{(7LX&M| zVAm)*#BZ3haM)ww2fQ{iZI1tic=BZtaj*(ah#ib3R@v+lYd%e!REzC)lT9pg`BtpA znmBr0Z228|SQX?4vDPcZS-seHKi6QzczzY@tRn#$#Ma$R#H<@QEY^5~1bIt7A;eV7 zDB`%7Uq=G16G!-qJ26sBM9i%r!K&orHQdK=O6U{w*5HEYxg=gg%aFmN^o!?Lp2a0k z5fuiCvK+}uqT*Gz92Y%IzscSFRr%Z&rMT>V`A8q{;^T@mHpnZ6*|?9pIW3O2nREa~ z@+q1SJZqe65ZmMKhlXN!~qIOGGp0`W-|5=B>4zG7CE+) zMUooHC&IwO(oR;whAC{WNv{@74ys8J6-0$whG$42WxB5m|FDo0Gi%5(fz#Ye3cB_3 w_4zo{Nl}yN;vj{jun-~svpgP;$K&z*3vb`h&57Sy$^ZZW07*qoM6N<$f{PVdi~s-t literal 0 HcmV?d00001 diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_home_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..04e2b26ff139fe6c17fdfd5ae816dfe8b94c32ec GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z^Lu%;uuoF_~zh7UMEG7wu}8u ze$iqVcxO1aUzmAM?7Zp>NAm>6EUQ`Ct*wSx>5qK>6$=Oo3Qm;g)G0o&@&xPba3#K6 z%^S&y&BmS5-@bSqnrJIp9eMMi%d*6LGb28kmp9tyGS|O5b6}s$oE^sD?xs9P9R!Z_ z75`B8Z(s2HaaOv+jvdD3_xj(@iQ5wQ?NL}~*gq)I8fJEYcY)~s9ia=R@)j^>s50MS zi2B(b%@}o%$-H0e=-I`tg`YD5@7P3%U~s1aWuF3ND}l0d=Ka%-V{k(oZvXyV8UMT3 y0~izy3@`p?t4o+3U}gbN`sg`LsuauFUJ57V2GxL(1Ce}%vI^v9l6B*1|Yo%qpke?LS4SQVFs!(RUIJ6^Kg TbtgoDfy&_N>gTe~DWM4fZJw9G literal 0 HcmV?d00001 diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_send_black_24dp.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/ic_send_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..761929f4319ed27f6d1f995d09eb2b9bc2de316a GIT binary patch literal 543 zcmV+)0^t3LP)x*fkZ{B`g7i!8I&_G+^jp3D98-1uOyT{3%&NQbJ*DmH;h=0&4#;NKAvc zngWD8@00GiD>ySpPfw%ED;&ph9LI5-3$`dDOrO9#M^uFcUS_~=>dFFfx_Utk2yf<& zL#na@CMZ#XI2|@AiwWojH6)m^LH(kxEMS9@5fBJ!L`Y6LsAWk36I4l8AWn}K6=i`! z1T`jn!d%jzq%2^A5)_C*{hV}APXs$kL0JK@psavcP*y-Js4$V~aX>{+zy`G>DPV)r z6R<(eC=1x2@(bh(YKnQ**yWUeTr*S;>I<{1u+1@l=<+bZpnjx+Qo5fu8;PKF?k63T z&i%xoY9x@kpL9@4_j5}#5tPvV^kY!@1?E^~hZFvC#pAmKzO$Gop#{FN#~J^*`EWw} zOc(o%)6-_1uf;#(bTk5Ioc`_<{*2Snl!|`F>1b;C&p1moA>Y{Fg$x4uf7pUlG#0UF zEGp6De_Cu(k$v1X(Z~qcw}$)z`QM|BfL1h?v05}nKrI?0pcRc}l>M1JgMf)fQJ_OZ zb=@XLBfE0eiqR+um}v9_;>v*7;;V^9Nx(!SBw#n;^aNrwGW6B<)s28&G*%#PM2m8+ h5{=_Hj^j9v^9)ES=TShce4YRR002ovPDHLkV1nL{>pK7d literal 0 HcmV?d00001 diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/tweets.png b/TwitterApp/TwitterDem/app/src/main/res/drawable/tweets.png new file mode 100644 index 0000000000000000000000000000000000000000..018e9aba2b406930d8834ea2bc7d2832a9749a17 GIT binary patch literal 9633 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 NLp@{63mxZ({{s~(n|A;J literal 0 HcmV?d00001 diff --git a/TwitterApp/TwitterDem/app/src/main/res/drawable/twitter.jpg b/TwitterApp/TwitterDem/app/src/main/res/drawable/twitter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bc7cd4ff7272d816996942bf008d92f5c4ca3ce GIT binary patch literal 22954 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 literal 0 HcmV?d00001 diff --git a/TwitterApp/TwitterDem/app/src/main/res/layout/activity_login.xml b/TwitterApp/TwitterDem/app/src/main/res/layout/activity_login.xml new file mode 100644 index 000000000000..e9c3a5d6712d --- /dev/null +++ b/TwitterApp/TwitterDem/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + +