Legacy Code Publication

This commit is contained in:
Krzysztof KrzysiekSiemv Smaga
2025-02-12 23:13:31 +01:00
parent 78ea931701
commit 27da9ec308
179 changed files with 7113 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
/build
+43
View File
@@ -0,0 +1,43 @@
plugins {
id 'com.android.application'
}
android {
compileSdk 32
defaultConfig {
applicationId "pl.krzysiek.simplesocial"
minSdk 26
targetSdk 32
versionCode 12
versionName "1.09"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility mysqlConnectorJavaVersion
targetCompatibility mysqlConnectorJavaVersion
}
compileSdkVersion 32
buildToolsVersion '32.0.0'
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation "mysql:mysql-connector-java:5.1.49"
// implementation "mysql:mysql-connector-java:8.0.20"
implementation "commons-io:commons-io:2.11.0"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
Binary file not shown.
+21
View File
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
Binary file not shown.
@@ -0,0 +1,26 @@
package pl.krzysiek.simplesocial;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("pl.krzysiek.simplesocial", appContext.getPackageName());
}
}
+61
View File
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="pl.krzysiek.simplesocial">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.SimpleSocial">
<activity
android:name=".Group"
android:exported="false" />
<activity
android:name=".CommentsManagement"
android:exported="false" />
<activity
android:name=".EditComments"
android:exported="false" />
<activity
android:name=".EditPost"
android:exported="false" />
<activity
android:name=".PostsManagement"
android:exported="false" />
<activity
android:name=".Profile"
android:exported="false" />
<activity
android:name=".Registration"
android:exported="false" />
<activity
android:name=".EditProfile"
android:exported="false" />
<activity
android:name=".ThePost"
android:exported="false" />
<activity
android:name=".NewPost"
android:exported="false" />
<activity
android:name=".Homepage"
android:exported="false" />
<activity
android:name=".Main"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
@@ -0,0 +1,187 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
public class CommentsManagement extends AppCompatActivity {
Server server;
LinearLayout commentsList;
static int id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_comments_management);
onLoad();
}
public void quit(View v){
Intent homepage = new Intent(this, Homepage.class);
startActivity(homepage);
finish();
}
public void onLoad(){
Bundle data = getIntent().getExtras();
id = data.getInt("user");
commentsList = findViewById(R.id.commentsList);
server = new Server();
refreshComments();
}
void refreshComments(){
ResultSet rs = server.query("*", "comments", "id_author = " + id);
try{
while(rs.next()) {
generateComment(
rs.getInt(1),
rs.getInt(2),
rs.getInt(3),
rs.getString(4),
rs.getString(5)
);
}
} catch (SQLException ex) { ex.printStackTrace(); }
}
@SuppressLint("SetTextI18n")
void generateComment(int id_comment, int id_post, int id_author, String dataUtworzenia, String tresc){
LinearLayout comment = new LinearLayout(commentsList.getContext());
LinearLayout.LayoutParams commentParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
commentParams.setMargins(0,4,8,4);
comment.setLayoutParams(commentParams);
comment.setId(View.generateViewId());
comment.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout buttonGroup = new LinearLayout(comment.getContext());
LinearLayout.LayoutParams btnGroupParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
buttonGroup.setLayoutParams(btnGroupParams);
buttonGroup.setId(View.generateViewId());
buttonGroup.setOrientation(LinearLayout.VERTICAL);
buttonGroup.setGravity(Gravity.CENTER);
LinearLayout commentContent = new LinearLayout(comment.getContext());
LinearLayout.LayoutParams commentsParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
commentContent.setLayoutParams(commentsParams);
commentContent.setId(View.generateViewId());
commentContent.setOrientation(LinearLayout.VERTICAL);
ContextThemeWrapper theme = new ContextThemeWrapper(buttonGroup.getContext(), R.style.Widget_MaterialComponents_Button);
LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
buttonParams.setMargins(8,2,8,2);
Button editButton = new Button(theme);
editButton.setLayoutParams(buttonParams);
editButton.setId(View.generateViewId());
editButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.description_icon, 0,0,0);
editButton.setOnClickListener(view -> {
Intent intent = new Intent(this, EditComments.class);
intent.putExtra("comment", id_comment);
intent.putExtra("user", id);
startActivity(intent);
finish();
});
Button deleteButton = new Button(theme);
deleteButton.setLayoutParams(buttonParams);
deleteButton.setId(View.generateViewId());
deleteButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.delete_icon,0,0,0);
deleteButton.setOnClickListener(view -> {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
DialogInterface.OnClickListener alertDialog = (dialog, which) -> {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
server.delete("comments", "id_comment = " + id_comment);
Toast.makeText(this, "Komentarz został usunięty", Toast.LENGTH_SHORT).show();
commentsList.removeAllViewsInLayout();
refreshComments();
break;
case DialogInterface.BUTTON_NEGATIVE:
break;
}
};
alert.setMessage("Czy na pewno chcesz usunąć ten komentarz?").setPositiveButton("Tak", alertDialog).setNegativeButton("Nie", alertDialog).show();
});
Button postButton = new Button(theme);
postButton.setLayoutParams(buttonParams);
postButton.setId(View.generateViewId());
postButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.gotopost_icon,0,0,0);
postButton.setOnClickListener(view -> {
Intent intent = new Intent(this, ThePost.class);
intent.putExtra("id_user", id);
intent.putExtra("id_post", id_post);
intent.putExtra("from", "comment");
startActivity(intent);
finish();
});
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
TextView commentToPost = new TextView(commentContent.getContext());
commentToPost.setId(View.generateViewId());
ResultSet rsPost = server.query("tytul", "posts", "id_post = " + id_post);
try{
while(rsPost.next())
commentToPost.setText("Komentarz do posta: \"" + rsPost.getString(1) + "\"");
} catch (SQLException ex){
ex.printStackTrace();
}
TextView commentText = new TextView(commentContent.getContext());
commentText.setId(View.generateViewId());
commentText.setTextAppearance(R.style.TextAppearance_AppCompat_Medium);
commentText.setText(tresc);
TextView addedText = new TextView(commentContent.getContext());
addedText.setId(View.generateViewId());
addedText.setTextAppearance(R.style.TextAppearance_AppCompat_Body2);
addedText.setText(dataUtworzenia);
View divider = new View(commentsList.getContext());
TableRow.LayoutParams dividerParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, (int) getResources().getDisplayMetrics().density);
dividerParams.setMargins(32, 32, 32, 32);
divider.setLayoutParams(dividerParams);
divider.setBackgroundColor(getColor(R.color.gray_400));
buttonGroup.addView(editButton);
buttonGroup.addView(postButton);
buttonGroup.addView(deleteButton);
commentContent.addView(commentToPost);
commentContent.addView(commentText);
commentContent.addView(addedText);
comment.addView(buttonGroup);
comment.addView(commentContent);
commentsList.addView(comment);
commentsList.addView(divider);
}
}
@@ -0,0 +1,88 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.ResultSet;
import java.sql.SQLException;
public class EditComments extends AppCompatActivity {
Server server;
Helpers helper;
EditText commentBox;
TextView postAuthor, postTitle, postText, postDate;
ImageView postImage;
int id_comment, id_post, id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_comments);
onLoad();
}
public void onLoad(){
server = new Server();
helper = new Helpers();
commentBox = findViewById(R.id.commentBox);
postAuthor = findViewById(R.id.postAuthor);
postTitle = findViewById(R.id.postTitle);
postText = findViewById(R.id.postText);
postDate = findViewById(R.id.postDate);
postImage = findViewById(R.id.postImage);
Bundle datas = getIntent().getExtras();
id_comment = datas.getInt("comment");
id = datas.getInt("user");
ResultSet rs = server.query("posts.id_post, comments.tresc, users.username, posts.tytul, posts.tresc, posts.typPosta, posts.dataDodania", "comments, posts, users", "id_comment = " + id_comment + " AND posts.id_post = comments.id_post AND users.id = posts.id_autor");
try{
while(rs.next()){
id_post = rs.getInt(1);
commentBox.setText(rs.getString(2));
postAuthor.setText("Post użytkownika " + rs.getString(3));
postTitle.setText(rs.getString(4));
postText.setText(rs.getString(5));
if(rs.getInt(6) > 0){
ResultSet rsImage = server.query("picture", "pictures", "id_post = " + id_post);
while(rsImage.next())
postImage.setImageBitmap(helper.convertToBitmap(rsImage.getString(1)));
}
postDate.setText("Dodano " + rs.getString(7));
}
} catch (SQLException ex){
ex.printStackTrace();
}
}
public void updateComment(View v){
server.update("comments", "tresc = '" + commentBox.getText() + "'", "id_comment = " + id_comment);
Toast.makeText(this, "Komentarz został zaktualizowany", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, ThePost.class);
intent.putExtra("id_user", id);
intent.putExtra("id_post", id_post);
intent.putExtra("from", "comment");
startActivity(intent);
finish();
}
public void quit(View v){
Intent intent = new Intent(this, CommentsManagement.class);
intent.putExtra("user", id);
startActivity(intent);
finish();
}
}
@@ -0,0 +1,80 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Debug;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.sql.ResultSet;
import java.sql.SQLException;
public class EditPost extends AppCompatActivity {
static Server server;
static Helpers helper;
static int id;
static int id_post;
boolean changePic;
EditText title, text;
ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_post);
onLoad();
}
public void onLoad(){
getIds();
server = new Server();
helper = new Helpers();
setObjects();
fillFields();
}
public void setObjects(){
title = findViewById(R.id.postTitle);
text = findViewById(R.id.postText);
img = findViewById(R.id.postImage);
}
public void getIds(){
Bundle datas = getIntent().getExtras();
id_post = datas.getInt("post");
id = datas.getInt("user");
}
public void fillFields(){
ResultSet rs = server.query("tytul, tresc, typPosta", "posts", "id_post = " + id_post);
try{
while(rs.next()){
title.setText(rs.getString(1));
text.setText(rs.getString(2));
if(rs.getInt(3) > 0){
ResultSet picRs = server.query("picture", "pictures", "pictures.id_post = " + id_post);
while(picRs.next()){
img.setImageBitmap(helper.convertToBitmap(picRs.getString(1)));
}
}
}
} catch (SQLException ex) { ex.printStackTrace(); }
}
public void quit(View v){
Intent intent = new Intent(this, PostsManagement.class);
intent.putExtra("user", id);
startActivity(intent);
finish();
}
public void saveChanges(View v) {
}
}
@@ -0,0 +1,175 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.DatePickerDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
public class EditProfile extends AppCompatActivity {
static int id_user;
Server server;
TextView username, birthdateBox;
EditText nameBox, emailBox, phoneBox, actualPassBox, newPassBox, rpPassBox;
RadioButton maleBox, femaleBox;
Button deleteBtn;
DatePickerDialog.OnDateSetListener dateSetListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_profile);
onLoad();
}
void onLoad(){
Bundle fromIntent = getIntent().getExtras();
server = new Server();
id_user = fromIntent.getInt("id_user");
loadObjects();
fillItAll();
}
@SuppressLint("SetTextI18n")
void loadObjects(){
username = findViewById(R.id.verifiedIcon);
nameBox = findViewById(R.id.nameBox);
emailBox = findViewById(R.id.emailBox);
phoneBox = findViewById(R.id.phoneBox);
actualPassBox = findViewById(R.id.actualPassBox);
newPassBox = findViewById(R.id.newPassBox);
rpPassBox = findViewById(R.id.rpPassBox);
birthdateBox = findViewById(R.id.birthdateBox);
maleBox = findViewById(R.id.maleBtn);
femaleBox = findViewById(R.id.femaleBtn);
deleteBtn = findViewById(R.id.deleteBtn);
dateSetListener = (datePicker, i, i1, i2) -> {
String year, month, day;
i1++;
month = (i1 < 10 ? "0" + i1 : Integer.toString(i1));
day = (i2 < 10 ? "0" + i2 : Integer.toString(i2));
year = Integer.toString(i);
birthdateBox.setText(year + "/" + month + "/" + day);
};
}
public void pickADate(View v){
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(this, android.app.AlertDialog.THEME_HOLO_DARK, dateSetListener, year, month, day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
void fillItAll(){
try{
ResultSet rs = server.query("username, nazwaWyswietlana, email, numerTelefonu, dataUrodzenia, plec", "users", "id = " + id_user);
while(rs.next()){
username.setText(rs.getString(1));
nameBox.setText(rs.getString(2));
emailBox.setText(rs.getString(3));
phoneBox.setText(rs.getString(4));
birthdateBox.setText(rs.getString(5));
if(rs.getBoolean(6))
maleBox.setChecked(true);
else
femaleBox.setChecked(true);
}
} catch (SQLException ex){
ex.printStackTrace();
}
}
public void exitEdit(View v){
Intent intent = new Intent(this, Homepage.class);
startActivity(intent);
finish();
}
@Override
public void onBackPressed(){
Intent intent = new Intent(this, Homepage.class);
startActivity(intent);
finish();
}
public void updateProfile(View v){
try{
ResultSet rs = server.query("id", "users", "password = PASSWORD('" + actualPassBox.getText() + "') AND id = " + id_user);
if(!actualPassBox.getText().equals("")) {
while (rs.next()) {
if (rs.getInt(1) == id_user) {
server.update("users", "nazwaWyswietlana = '" + nameBox.getText() + "', email = '" + emailBox.getText() + "', numerTelefonu = '" + phoneBox.getText() + "', dataUrodzenia = '" + birthdateBox.getText() + "'", "id = " + id_user);
if(maleBox.isChecked())
server.update("users", "plec = 1", "id = " + id_user);
else
server.update("users", "plec = 0", "id = " + id_user);
Toast.makeText(this, "Profil został zaktualizowany!", Toast.LENGTH_SHORT).show();
if (newPassBox.getText() == rpPassBox.getText()) {
server.update("users", "password = PASSWORD('" + newPassBox.getText() + "')", "id = " + id_user);
Toast.makeText(this, "Hasło zostało zaktualizowane!", Toast.LENGTH_SHORT).show();
}
finish();
} else
Toast.makeText(this, "Wpisz swoje obecne hasło, aby zaktualizować swój profil!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "Wpisz swoje obecne hasło, aby zaktualizować swój profil!", Toast.LENGTH_SHORT).show();
}
} catch (SQLException ex){
ex.printStackTrace();
}
}
public void deleteBtnAction(View v){
areYouSure();
}
void areYouSure(){
AlertDialog.Builder builder = new AlertDialog.Builder(deleteBtn.getContext());
DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
server.delete("posts", "id_autor = " + id_user);
server.delete("comments", "id_author = " + id_user);
Toast.makeText(deleteBtn.getContext(), "Konto zostało usunięte :(", Toast.LENGTH_SHORT).show();
server.delete("users", "id = " + id_user);
Intent intent = new Intent(deleteBtn.getContext(), Main.class);
finish();
startActivity(intent);
break;
case DialogInterface.BUTTON_NEGATIVE:
Toast.makeText(deleteBtn.getContext(), "Uff... Fajnie, że zostajesz z nami :D", Toast.LENGTH_SHORT).show();
break;
}
};
builder.setMessage("Czy na pewno chcesz usunąć konto? Wszystkie Twoje posty, komentarze oraz inne ślady znikną z serwisu. :/").setPositiveButton("Tak", dialogClickListener).setNegativeButton("Nie", dialogClickListener).show();
}
}
@@ -0,0 +1,39 @@
package pl.krzysiek.simplesocial;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import java.sql.ResultSet;
import java.sql.SQLException;
public class GetEveryData extends AsyncTask<Integer, Void, String[][]> {
Helpers helper;
Server server;
public GetEveryData(Helpers help, Server srv){
helper = help;
server = srv;
}
@Override
protected String[][] doInBackground(Integer[] params){
String[][] table = new String[params.length][5];
for(int i = 0; i < params.length; i++){
ResultSet rs = server.query("posts.id_post, users.username, posts.tresc, posts.dataDodania, posts.tytul", "posts, users", "posts.id_post = " + params[i] + " AND users.id = posts.id_autor");
try{
while(rs.next()){
for(int j = 0; j < 5; j++){
table[i][j] = rs.getString(j + 1);
}
}
} catch (SQLException ex){
ex.printStackTrace();
}
}
return table;
}
@Override
protected void onPostExecute(String[][] table){
super.onPostExecute(table);
}
}
@@ -0,0 +1,41 @@
package pl.krzysiek.simplesocial;
import android.content.Context;
import android.graphics.Bitmap;
import android.media.Image;
import android.os.AsyncTask;
import android.widget.ImageView;
import android.widget.Toast;
import java.sql.ResultSet;
import java.sql.SQLException;
public class GetMeImage extends AsyncTask<String, Void, Bitmap> {
private final ImageView img;
Helpers helpers;
Server server;
public GetMeImage(ImageView image, Helpers helper, Server srv){
img = image;
helpers = helper;
server = srv;
}
@Override
protected Bitmap doInBackground(String... id_post){
Bitmap bmp = null;
try {
ResultSet rs = server.query("picture", "posts_pictures", "id_post = " + id_post[0]);
while(rs.next()){
bmp = helpers.convertToBitmap(rs.getString(1));
}
} catch (SQLException ex){
ex.printStackTrace();
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap result){
super.onPostExecute(result);
img.setImageBitmap(result);
}
}
@@ -0,0 +1,14 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class Group extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group);
}
}
@@ -0,0 +1,401 @@
package pl.krzysiek.simplesocial;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.motion.widget.Debug;
import androidx.constraintlayout.widget.ConstraintLayout;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.concurrent.atomic.AtomicReference;
public class Helpers extends AppCompatActivity {
final Server server = new Server();
Bitmap bmp;
public Bitmap convertToBitmap(String base64) {
byte[] decodedBytes = Base64.getDecoder().decode(base64);
return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
}
public String getThatPath(Uri uri, Context activity){
String[] filePathColumn = {MediaStore.Images.Media.DATA};
String yourRealPath = null;
Cursor cursor = activity.getContentResolver().query(uri, filePathColumn, null, null, null);
if(cursor.moveToFirst()){
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
yourRealPath = cursor.getString(columnIndex);
} else
Debug.logStack("Błąd!", "Coś wyszło nie tak przy getThatPath. Linia 30 w Helpers", 1);
cursor.close();
return yourRealPath;
}
public String convertToBase64(Intent data, Context activity) {
String x = "";
try {
byte[] fileContent = org.apache.commons.io.FileUtils.readFileToByteArray(new File(getThatPath(data.getData(), activity)));
x = Base64.getEncoder().encodeToString(fileContent);
} catch (IOException ex){
ex.printStackTrace();
}
return x;
}
public String GetDate(){
LocalDateTime dateTime = LocalDateTime.now();
return dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@SuppressLint({"SetTextI18n", "ResourceAsColor", "UseCompatLoadingForDrawables", "StaticFieldLeak"})
public void GeneratePosts(LinearLayout postsList, int id_user, Activity activity, Context context, String from, String id_post, String autor, String text, String title, String datetime){
boolean nsfw = false;
TableLayout table = new TableLayout(postsList.getContext());
TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT);
table.setId(View.generateViewId());
table.setLayoutParams(tableParams);
TableRow authorRow = new TableRow(table.getContext());
authorRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
TextView authorLabel = new TextView(authorRow.getContext());
authorLabel.setPadding(16,16,16,16);
authorLabel.setText(autor + " \nDodano: " + datetime);
/* */
TableRow titleRow = new TableRow(table.getContext());
titleRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
TextView titleLabel = new TextView(titleRow.getContext());
titleLabel.setPadding(16,16,16,4);
titleLabel.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
titleLabel.setTextAppearance(R.style.TextAppearance_AppCompat_Large);
titleLabel.setMaxLines(2);
titleLabel.setTextSize(20f);
titleLabel.setText(title);
titleLabel.setOnClickListener(view -> {
Intent thePostIntent = new Intent(context, ThePost.class);
thePostIntent.putExtra("id_user", id_user);
thePostIntent.putExtra("id_post", id_post);
thePostIntent.putExtra("from", from);
activity.startActivity(thePostIntent);
});
/* */
TableRow textRow = new TableRow(table.getContext());
textRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
TextView textLabel = new TextView(textRow.getContext());
textLabel.setPadding(16,4,16,16);
textLabel.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
textLabel.setMaxLines(5);
textLabel.setTextSize(20f);
textLabel.setText(text);
textLabel.setOnClickListener(view -> {
Intent thePostIntent = new Intent(context, ThePost.class);
thePostIntent.putExtra("id_user", id_user);
thePostIntent.putExtra("id_post", id_post);
thePostIntent.putExtra("from", from);
activity.startActivity(thePostIntent);
});
ImageView image = new ImageView(table.getContext());
try{
ResultSet haveImage = server.query("typPosta", "posts", "id_post = " + id_post);
while(haveImage.next()){
if(haveImage.getBoolean(1)){
TableLayout.LayoutParams layout = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
layout.setMargins(0, 16, 0, 32);
image.setLayoutParams(layout);
image.setAdjustViewBounds(true);
image.setId(View.generateViewId());
image.setMaxHeight(1920);
GetMeImage gmi = new GetMeImage(image, this, server);
gmi.doInBackground(id_post);
WeakReference<ImageView> imageViewWeakReference = new WeakReference<>(image);
new AsyncTask<String, Void, Bitmap>(){
@Override
protected Bitmap doInBackground(String... strings){
Bitmap bitmap = null;
try {
ResultSet rs = server.query("picture", "posts_pictures", "id_post = " + id_post);
while(rs.next()){
bitmap = convertToBitmap(rs.getString(1));
}
} catch (SQLException ex){
ex.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap){
super.onPostExecute(bitmap);
if(bitmap != null){
ImageView weak = imageViewWeakReference.get();
if(weak != null)
weak.setImageBitmap(bitmap);
}
}
}.execute();
/*ResultSet getImage = server.query("picture", "posts_pictures", "id_post = " + id_post);
while (getImage.next()) {
image.setImageBitmap(convertToBitmap(getImage.getString(1)));*/
}
}
} catch (SQLException ex){
ex.printStackTrace();
}
TableRow nsfwTag = new TableRow(table.getContext());
nsfwTag.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
nsfwTag.setGravity(Gravity.START);
ImageView nsfwIcon = new ImageView(nsfwTag.getContext());
nsfwIcon.setImageDrawable(context.getDrawable(R.drawable.warning));
nsfwIcon.setId(View.generateViewId());
TableRow.LayoutParams iconLayout = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
iconLayout.setMargins(16,16,4,16);
nsfwIcon.setLayoutParams(iconLayout);
nsfwIcon.setBackgroundColor(Color.BLACK);
nsfwIcon.setMaxWidth(32);
TextView nsfwText = new TextView(nsfwTag.getContext());
nsfwText.setText("NSFW");
TableRow.LayoutParams textLayout = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
textLayout.setMargins(4,16,16,16);
nsfwText.setLayoutParams(textLayout);
nsfwTag.addView(nsfwIcon);
nsfwTag.addView(nsfwText);
/* */
TableRow likesRow = new TableRow(table.getContext());
likesRow.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
ConstraintLayout inLikesRow = new ConstraintLayout(likesRow.getContext());
inLikesRow.setId(View.generateViewId());
TableRow.LayoutParams inLikesRowParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT, 1.0f);
inLikesRow.setLayoutParams(inLikesRowParams);
ContextThemeWrapper newContext = new ContextThemeWrapper(context, R.style.Widget_MaterialComponents_Button);
Button likesBtn = new Button(newContext);
likesBtn.setId(View.generateViewId());
ConstraintLayout.LayoutParams likeParams = new ConstraintLayout.LayoutParams((int) context.getResources().getDisplayMetrics().density * 70, ConstraintLayout.LayoutParams.WRAP_CONTENT);
likeParams.setMarginStart(8);
likeParams.startToStart = 0;
likeParams.topToTop = 0;
likeParams.bottomToBottom = 0;
likesBtn.setGravity(Gravity.CENTER);
TextView likesCount = new TextView(inLikesRow.getContext());
ConstraintLayout.LayoutParams likesCountParams = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT);
likesCountParams.startToEnd = likesBtn.getId();
likesCountParams.bottomToBottom = 0;
likesCountParams.topToTop = 0;
likesCountParams.setMarginStart(8);
likesCount.setGravity(Gravity.CENTER);
likesCount.setTextAppearance(R.style.TextAppearance_AppCompat_Large);
likesCount.setId(View.generateViewId());
likesCount.setLayoutParams(likesCountParams);
try {
ResultSet rs = server.query("COUNT(*)", "posts_likes", "id_post = " + id_post);
while(rs.next())
likesCount.setText(rs.getString(1));
} catch (SQLException ex){
ex.printStackTrace();
}
likesBtn.setLayoutParams(likeParams);
try{
ResultSet rs = server.query("id_like", "posts_likes", "id_post = " + id_post + " AND id_user = " + id_user);
if(!rs.isBeforeFirst())
likesBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.like_icon, 0, 0, 0);
else
likesBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.liked_icon, 0,0,0);
} catch (SQLException ex) {
ex.printStackTrace();
}
likesBtn.setOnClickListener(view -> {
try{
ResultSet rs = server.query("id_like", "posts_likes", "id_post = " + id_post + " AND id_user = " + id_user);
if(!rs.isBeforeFirst()) {
server.insert("posts_likes", "NULL, " + id_post + ", " + id_user + ", '" + GetDate() + "'");
likesBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.liked_icon, 0,0,0);
} else {
server.delete("posts_likes", "id_post = " + id_post + " AND id_user = " + id_user);
likesBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.like_icon, 0, 0, 0);
}
ResultSet rsLikes = server.query("COUNT(*)", "posts_likes", "id_post = " + id_post);
while(rsLikes.next())
likesCount.setText(rsLikes.getString(1));
} catch (SQLException ex){
ex.printStackTrace();
}
});
View divider = new View(inLikesRow.getContext());
divider.setId(View.generateViewId());
ConstraintLayout.LayoutParams dividerParams = new ConstraintLayout.LayoutParams((int) context.getResources().getDisplayMetrics().density, ConstraintLayout.LayoutParams.MATCH_PARENT);
dividerParams.startToEnd = likesCount.getId();
dividerParams.topToTop = 0;
dividerParams.bottomToBottom = 0;
dividerParams.setMargins(16, 0, 0, 0);
divider.setLayoutParams(dividerParams);
divider.setBackgroundColor(context.getColor(R.color.gray_600));
Button commentsBtn = new Button(newContext);
commentsBtn.setId(View.generateViewId());
ConstraintLayout.LayoutParams commentsParams = new ConstraintLayout.LayoutParams((int) context.getResources().getDisplayMetrics().density * 70, ConstraintLayout.LayoutParams.WRAP_CONTENT);
commentsParams.setMarginStart(16);
commentsParams.startToEnd = divider.getId();
commentsParams.topToTop = 0;
commentsParams.bottomToBottom = 0;
commentsBtn.setGravity(Gravity.CENTER);
commentsBtn.setCompoundDrawablesWithIntrinsicBounds(0,0,R.drawable.comment_icon,0);
commentsBtn.setLayoutParams(commentsParams);
commentsBtn.setOnClickListener(view ->{
Intent thePostIntent = new Intent(context, ThePost.class);
thePostIntent.putExtra("id_user", id_user);
thePostIntent.putExtra("id_post", id_post);
thePostIntent.putExtra("from", from);
activity.startActivity(thePostIntent);
});
View divider2 = new View(postsList.getContext());
TableRow.LayoutParams divider2Params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, (int) context.getResources().getDisplayMetrics().density);
divider2Params.setMargins(32, 32, 32, 32);
divider2.setLayoutParams(divider2Params);
divider2.setBackgroundColor(context.getColor(R.color.gray_400));
try{
ResultSet checkNsfw = server.query("nsfw", "posts", "id_post = " + id_post);
while(checkNsfw.next()){
nsfw = checkNsfw.getBoolean(1);
}
} catch (SQLException ex){
ex.printStackTrace();
}
titleRow.addView(titleLabel);
inLikesRow.addView(likesBtn);
inLikesRow.addView(likesCount);
inLikesRow.addView(divider);
inLikesRow.addView(commentsBtn);
likesRow.addView(inLikesRow);
textRow.addView(textLabel);
authorRow.addView(authorLabel);
table.addView(authorRow);
table.addView(titleRow);
if(!nsfw) {
table.addView(textRow);
table.addView(image);
} else {
table.addView(nsfwTag);
}
table.addView(likesRow);
postsList.addView(table);
postsList.addView(divider2);
}
@SuppressLint("SetTextI18n")
void GenerateComments(LinearLayout commentList, String autor, Context context, String tresc, String dataUtworzenia, TextView author){
LinearLayout comment = new LinearLayout(commentList.getContext());
LinearLayout.LayoutParams linParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
comment.setOrientation(LinearLayout.VERTICAL);
comment.setId(View.generateViewId());
comment.setLayoutParams(linParams);
TableRow.LayoutParams rowParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableRow authorRow = new TableRow(comment.getContext());
authorRow.setId(View.generateViewId());
authorRow.setLayoutParams(rowParams);
TextView authorText = new TextView(authorRow.getContext());
authorText.setId(View.generateViewId());
authorText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
authorText.setPadding(16, 16, 16, 4);
authorText.setText(autor + " odpowiedział " + author.getText());
TableRow content = new TableRow(comment.getContext());
content.setId(View.generateViewId());
content.setLayoutParams(rowParams);
TextView contentText = new TextView(author.getContext());
contentText.setId(View.generateViewId());
contentText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
contentText.setPadding(16, 4, 16, 4);
contentText.setAutoLinkMask(Linkify.ALL);
contentText.setMovementMethod(LinkMovementMethod.getInstance());
contentText.setText(tresc);
TableRow added = new TableRow(comment.getContext());
added.setId(View.generateViewId());
added.setLayoutParams(rowParams);
TextView addedText = new TextView(author.getContext());
addedText.setId(View.generateViewId());
addedText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
addedText.setPadding(16, 4, 16, 16);
addedText.setText("Dodano " + dataUtworzenia);
View divider = new View(commentList.getContext());
TableRow.LayoutParams dividerParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, (int) context.getResources().getDisplayMetrics().density);
dividerParams.setMargins(32, 32, 32, 32);
divider.setLayoutParams(dividerParams);
divider.setBackgroundColor(context.getColor(R.color.gray_400));
authorRow.addView(authorText);
content.addView(contentText);
added.addView(addedText);
comment.addView(authorRow);
comment.addView(content);
comment.addView(added);
commentList.addView(comment);
commentList.addView(divider);
}
}
@@ -0,0 +1,473 @@
package pl.krzysiek.simplesocial;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.InputFilter;
import android.view.*;
import android.widget.*;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.*;
import java.io.IOException;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.ExecutionException;
public class Homepage extends AppCompatActivity implements Serializable {
public static int id;
TextView loggedAs;
FloatingActionButton newPostBtn;
Button refreshBtn;
ScrollView homeView, menuView, searchView;
TabLayout navigationTab;
LinearLayout postsList, searchResults;
int posts = 0;
EditText searchBar;
ImageView avatarUser;
SharedPreferences settings;
SharedPreferences.Editor editor;
Server server;
Helpers helper;
Activity activity = this;
Intent imageData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.homepage);
GetFromMain();
onLoad();
refreshHomepage();
changeTab();
}
void GetFromMain(){
id = Main.id;
settings = Main.settings;
editor = Main.editor;
}
public void AddNewPost(View v){
Intent intent = new Intent(this, NewPost.class);
startActivity(intent);
finish();
}
@SuppressLint("SetTextI18n")
public void onLoad(){
postsList = findViewById(R.id.postsList);
server = new Server();
helper = new Helpers();
loggedAs = findViewById(R.id.loggedAsText);
newPostBtn = findViewById(R.id.button);
refreshBtn = findViewById(R.id.refreshHomepage);
avatarUser = findViewById(R.id.avatarUser);
searchBar = findViewById(R.id.searchET);
navigationTab = findViewById(R.id.navigationTab);
searchView = findViewById(R.id.searchView);
homeView = findViewById(R.id.homeView);
menuView = findViewById(R.id.menuView);
searchResults = findViewById(R.id.searchResults);
ResultSet rs = server.query("username, nazwaWyswietlana, avatar", "users", "id = " + id);
try {
while(rs.next()) {
if(rs.getString(2).matches(""))
loggedAs.setText("Witaj,\n" + rs.getString(1));
else
loggedAs.setText("Witaj,\n" + rs.getString(2));
if(rs.getString(3) != null) {
if (!rs.getString(3).matches(""))
avatarUser.setImageBitmap(helper.convertToBitmap(rs.getString(3)));
else
avatarUser.setImageIcon(Icon.createWithResource(this, R.drawable.default_avatar));
} else
avatarUser.setImageIcon(Icon.createWithResource(this, R.drawable.default_avatar));
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
public void addMore(View v){
refreshHomepage();
}
public void refresh(View v){
postsList.removeAllViewsInLayout();
posts = 0;
refreshHomepage();
}
public void changeAvatar(View v){
imgAdd();
}
private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { imgAdd(); } else { Toast.makeText(this, "Nie możesz dodać zdjęcia do postu, ponieważ nie zezwoliłeś aplikacji na dostęp do plików.", Toast.LENGTH_LONG).show(); } });
@SuppressLint("IntentReset")
public void imgAdd(){
if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");
startActivityForResult(pickIntent, 1);
} else {
requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
}
}
@SuppressLint("StaticFieldLeak")
public void refreshHomepage(){
/*String[][] publicTable = null;
new Thread(() -> {
int size = 0;
String[][] table = null;
try {
ResultSet rs1 = server.query("posts.id_post", "posts");
if (rs1 != null) {
rs1.last();
size = rs1.getRow();
}
int[] id_posts = new int[size];
ResultSet rs2 = server.query("posts.id_post", "posts");
while (rs2.next()) {
for (int i = 0; i < size; i++) {
rs2.absolute(i + 1);
id_posts[i] = rs2.getInt(1);
}
}
table = new String[size][5];
for (int i = 0; i < size; i++) {
String[][] finalTable = table;
int x = i;
new Thread(() ->{
GetEveryData data = new GetEveryData(id_posts[x], server);
finalTable[x][0] = data.giveData()[0];
finalTable[x][1] = data.giveData()[1];
finalTable[x][2] = data.giveData()[2];
finalTable[x][3] = data.giveData()[3];
finalTable[x][4] = data.giveData()[4];
}).start();
runOnUiThread(() -> {
helper.GeneratePosts(
postsList,
id,
activity,
getBaseContext(),
"homepage",
finalTable[x][0],
finalTable[x][1],
finalTable[x][2],
finalTable[x][4],
finalTable[x][3]
);
});
}
publicTable = table;
} catch (SQLException ex) {
ex.printStackTrace();
}
}).start();*/
ResultSet rs = server.query("posts.id_post, users.username, posts.tresc, posts.dataDodania, posts.tytul", "posts, users", "users.id = posts.id_autor", "ORDER BY id_post DESC LIMIT " + posts + ",5");
new AsyncTask<ResultSet, Void, String>(){
@Override
protected String doInBackground(ResultSet... params){
runOnUiThread(() -> {
try {
while (rs.next()) {
helper.GeneratePosts(
postsList,
id,
activity,
getBaseContext(),
"homepage",
params[0].getString(1),
params[0].getString(2),
params[0].getString(3),
params[0].getString(5),
params[0].getString(4)
);
}
} catch (SQLException ex){
ex.printStackTrace();
}
});
return "";
}
}.execute(rs);
Toast.makeText(this, "Pomyślnie zaktualizowano!", Toast.LENGTH_SHORT).show();
posts += 5;
}
public String[] con(String[] to){ return to;}
public void goToProfile(View v){
Intent intent = new Intent(this, Profile.class);
intent.putExtra("id_user", id);
startActivity(intent);
finish();
}
public void changeTab(){
navigationTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch(tab.getPosition()){
case 0:
homeView.setVisibility(View.VISIBLE);
refreshBtn.setVisibility(View.VISIBLE);
newPostBtn.setVisibility(View.VISIBLE);
break;
case 1:
break;
case 2:
searchView.setVisibility(View.VISIBLE);
break;
case 3:
menuView.setVisibility(View.VISIBLE);
break;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
switch(tab.getPosition()){
case 0:
homeView.setVisibility(View.GONE);
refreshBtn.setVisibility(View.GONE);
newPostBtn.setVisibility(View.GONE);
break;
case 1:
break;
case 2:
searchView.setVisibility(View.GONE);
break;
case 3:
menuView.setVisibility(View.GONE);
break;
}
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
public void logOff(View v){
editor.putInt("userID", 0);
editor.apply();
Intent intent = new Intent(this, Main.class);
startActivity(intent);
finish();
}
public void editProfile(View v){
Intent intent = new Intent(this, EditProfile.class);
intent.putExtra("id_user", id);
startActivity(intent);
finish();
}
public void editDescription(View v){
EditText descriptionText = new EditText(this);
TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
params.setMargins(4,4,4,4);
descriptionText.setLayoutParams(params);
descriptionText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(200)});
AlertDialog.Builder alert = new AlertDialog.Builder(this);
try{
ResultSet rs = server.query("opis", "users", "id = " + id);
while(rs.next()){
descriptionText.setText(rs.getString(1));
}
} catch (SQLException ex){
ex.printStackTrace();
}
alert.setTitle("Twój opis");
alert.setView(descriptionText);
alert.setPositiveButton("Zapisz", (dialogInterface, i) -> {
server.update("users", "opis = '" + descriptionText.getText().toString() + "'", "id = " + id);
Toast.makeText(alert.getContext(), "Opis został zmieniony", Toast.LENGTH_SHORT).show();
});
alert.setNegativeButton("Anuluj", (dialogInterface, i) -> {
});
alert.show();
}
public void search(View v){
searchResults.removeAllViewsInLayout();
findInAll(searchBar.getText().toString());
}
public void findInAll(String phrase){
try {
// Uzytkownicy
ResultSet usersRS = server.query("username, opis, nazwaWyswietlana, zweryfikowany, avatar, id", "users", "username LIKE '%" + phrase + "%' OR nazwaWyswietlana LIKE '%" + phrase + "%' OR opis LIKE '%" + phrase + "%' LIMIT 3");
if(usersRS.isBeforeFirst()){
TextView textOne = new TextView(searchResults.getContext());
textOne.setId(View.generateViewId());
LinearLayout.LayoutParams textOneParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
textOne.setPadding(8, 8, 8, 8);
textOne.setLayoutParams(textOneParams);
textOne.setTextAppearance(R.style.TextAppearance_AppCompat_Medium);
textOne.setText("Użytkownicy");
searchResults.addView(textOne);
while (usersRS.next()) {
int id_user = usersRS.getInt(6);
TableRow userRow = new TableRow(searchResults.getContext());
userRow.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
userRow.setId(View.generateViewId());
userRow.setPadding(8,8,8,8);
ImageView avatarUser = new ImageView(userRow.getContext());
avatarUser.setId(View.generateViewId());
TableRow.LayoutParams avatarParams = new TableRow.LayoutParams((int) getResources().getDisplayMetrics().density * 64, (int) getResources().getDisplayMetrics().density * 64);
avatarParams.setMargins(8, 8, 4, 8);
avatarUser.setLayoutParams(avatarParams);
avatarUser.setAdjustViewBounds(true);
avatarUser.setScaleType(ImageView.ScaleType.CENTER_CROP);
if (usersRS.getString(5) != null) {
avatarUser.setImageBitmap(helper.convertToBitmap(usersRS.getString(5)));
} else {
avatarUser.setImageIcon(Icon.createWithResource(this, R.drawable.default_avatar));
}
avatarUser.setOnClickListener(view -> {
Intent intent = new Intent(this, Profile.class);
intent.putExtra("id_user", id_user);
startActivity(intent);
finish();
});
userRow.addView(avatarUser);
LinearLayout otherData = new LinearLayout(userRow.getContext());
otherData.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
otherData.setOrientation(LinearLayout.VERTICAL);
otherData.setId(View.generateViewId());
TableRow usernameRow = new TableRow(otherData.getContext());
usernameRow.setId(View.generateViewId());
usernameRow.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
if (usersRS.getBoolean(4)) {
ImageView verifiedIcon = new ImageView(usernameRow.getContext());
verifiedIcon.setId(View.generateViewId());
TableRow.LayoutParams verifiedParam = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT);
verifiedParam.setMargins(8, 8, 4, 4);
verifiedIcon.setLayoutParams(verifiedParam);
verifiedIcon.setImageIcon(Icon.createWithResource(this, R.drawable.verified_icon));
usernameRow.addView(verifiedIcon);
}
TextView username = new TextView(usernameRow.getContext());
username.setId(View.generateViewId());
TableRow.LayoutParams usernameParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
usernameParams.setMargins(4, 8, 8, 4);
username.setLayoutParams(usernameParams);
username.setText(usersRS.getString(1));
username.setOnClickListener(view -> {
Intent intent = new Intent(this, Profile.class);
intent.putExtra("id_user", id_user);
startActivity(intent);
finish();
});
TextView description = new TextView(otherData.getContext());
description.setId(View.generateViewId());
TableRow.LayoutParams descriptionParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
descriptionParams.setMargins(8, 4, 8, 8);
description.setLayoutParams(descriptionParams);
description.setText(usersRS.getString(2));
description.setOnClickListener(view -> {
Intent intent = new Intent(this, Profile.class);
intent.putExtra("id_user", id_user);
startActivity(intent);
finish();
});
usernameRow.addView(username);
otherData.addView(usernameRow);
otherData.addView(description);
userRow.addView(otherData);
searchResults.addView(userRow);
}
}
} catch (SQLException ex){
ex.printStackTrace();
}
}
public void postManagement(View v) {
Intent intent = new Intent(this, PostsManagement.class);
startActivity(intent);
finish();
}
public void commentManagement(View v){
Intent intent = new Intent(this, CommentsManagement.class);
intent.putExtra("user", id);
startActivity(intent);
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == RESULT_OK) {
Bitmap bitmap = null;
if(data != null){
try{
imageData = data;
bitmap = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), imageData.getData());
Toast.makeText(this, helper.getThatPath(data.getData(), this), Toast.LENGTH_SHORT).show();
server.update("users", "avatar = '" + helper.convertToBase64(imageData, this) + "'", "id = " + id);
} catch (IOException ex){
ex.printStackTrace();
}
}
avatarUser.setImageBitmap(bitmap);
Toast.makeText(this, "Zmieniono", Toast.LENGTH_SHORT).show();
}
}
}
@@ -0,0 +1,162 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.StrictMode;
import android.text.InputType;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.Toast;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Main extends AppCompatActivity {
public static int id;
boolean automaticLogIn = false;
EditText usernameText;
EditText passwordText;
Switch showPassword;
public static Server server;
public static SharedPreferences settings;
public static SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
onLoad();
passwordText.setOnEditorActionListener((v, actionId, event) -> {
if(actionId == EditorInfo.IME_ACTION_GO){
if(!usernameText.getText().toString().matches("") && !passwordText.getText().toString().matches(""))
LogIn();
else
Toast.makeText(this, "Nie możesz się zalogować bez podania danych do logowania!", Toast.LENGTH_LONG).show();
}
return true;
});
showPassword.setOnCheckedChangeListener((compoundButton, b) -> {
if(b)
passwordText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
else {
passwordText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
}
});
}
public void onLoad(){
setObjects();
policySet();
server = new Server();
showPassword = findViewById(R.id.showPassword);
settings = getApplicationContext().getSharedPreferences("userID", MODE_PRIVATE);
editor = settings.edit();
if(settings.getInt("userID", MODE_PRIVATE) == 0) {
automaticLogIn = false;
}else{
automaticLogIn = true;
LogIn();
}
}
@Override
public void onBackPressed(){
server.close();
finish();
}
void setObjects(){
usernameText = findViewById(R.id.usernameBar);
passwordText = findViewById(R.id.passwordBar);
}
// Wymagane, aby mógł się połączyć z siecią
public void policySet(){
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
public void AddToTable(View v){
Intent intent = new Intent(this, Registration.class);
startActivity(intent);
}
public void LogInBtn(View v){
if(!usernameText.getText().toString().matches("") && !passwordText.getText().toString().matches(""))
LogIn();
else
Toast.makeText(this, "Nie możesz się zalogować bez podania danych do logowania!", Toast.LENGTH_LONG).show();
}
void LogIn(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
DialogInterface.OnClickListener dialogClickListener;
try{
if(!automaticLogIn){
ResultSet rs = server.query("id, username, nazwaWyswietlana", "users", "username = '" + usernameText.getText() + "' OR numerTelefonu = '" + usernameText.getText() + "' OR email = '" + usernameText.getText() + "' AND password = PASSWORD('" + passwordText.getText() + "')");
if(rs.isBeforeFirst()){
while (rs.next()) {
id = rs.getInt(1);
String username = rs.getString(2);
String displayname = rs.getString(3);
dialogClickListener = (dialogInterface, i) -> {
switch (i) {
case DialogInterface.BUTTON_POSITIVE:
editor.putInt("userID", id);
editor.apply();
TheThirdLogIn(username, displayname);
break;
case DialogInterface.BUTTON_NEGATIVE:
TheThirdLogIn(username, displayname);
break;
}
};
builder.setMessage("Czy chcesz zachować zalogowane konto na urządzeniu?").setPositiveButton("Tak", dialogClickListener).setNegativeButton("Nie", dialogClickListener).show();
}
} else {
Toast.makeText(this, "Nie poprawne dane logowania", Toast.LENGTH_LONG).show();
}
} else {
id = settings.getInt("userID", 0);
ResultSet rs = server.query("username, nazwaWyswietlana", "users", "id = " + id);
while(rs.next()){
TheThirdLogIn(rs.getString(1), rs.getString(2));
}
}
} catch(SQLException ex){
Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();
}
}
public void GoToHomepage(){
Intent intent = new Intent(this, Homepage.class);
startActivity(intent);
finish();
}
void TheThirdLogIn(String username, String displayname){
if (displayname == null)
Toast.makeText(Main.this, "Witaj ponownie, " + username + "!", Toast.LENGTH_LONG).show();
else
Toast.makeText(Main.this, "Witaj ponownie, " + displayname + "!", Toast.LENGTH_LONG).show();
GoToHomepage();
}
}
@@ -0,0 +1,134 @@
package pl.krzysiek.simplesocial;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
public class NewPost extends AppCompatActivity {
static int id;
Server server;
Helpers helper;
EditText text, title;
CheckBox nsfwTag;
ImageView imageToPost;
Intent imageData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_post);
onLoad();
}
void onLoad(){
server = new Server();
helper = new Helpers();
id = Homepage.id;
text = findViewById(R.id.postTextBox);
title = findViewById(R.id.titleBox);
imageToPost = findViewById(R.id.imageToPost);
nsfwTag = findViewById(R.id.nsfwTag);
}
public void addPost(View v){
if(!title.getText().toString().matches("")) {
String date = helper.GetDate();
String nsfw = "";
if (nsfwTag.isChecked())
nsfw = "1";
else
nsfw = "0";
try {
int id_post = 0;
if (imageData != null) {
server.insert("posts", "id_autor, dataDodania, tytul, tresc, typPosta, nsfw", id + ", NOW(), \"" + title.getText() + "\", \"" + text.getText() + "\", 1, " + nsfw);
ResultSet rsNew = server.query("id_post", "posts", "id_autor = '" + id + "' AND tytul = '" + title.getText() + "' AND tresc = '" + text.getText() + "' AND typPosta = '1';");
while (rsNew.next()) {
id_post = rsNew.getInt(1);
}
uploadImage(id, id_post, date, imageData);
} else
server.insert("posts", "id_autor, dataDodania, tytul, tresc, typPosta, nsfw", id + ", \"" + date + "\", \"" + title.getText() + "\", \"" + text.getText() + "\", 0, " + nsfw);
Toast.makeText(this, "Post został utworzony", Toast.LENGTH_LONG).show();
Intent intent = new Intent(this, ThePost.class);
intent.putExtra("id_post", id_post);
intent.putExtra("id_user", id);
intent.putExtra("from", "homepage");
startActivity(intent);
finish();
} catch (SQLException ex) {
ex.printStackTrace();
}
} else {
Toast.makeText(this, "Post musi zawierać tytuł!", Toast.LENGTH_LONG).show();
}
}
@SuppressLint("RestrictedApi")
public void addImage(View v){
imgAdd();
}
private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { imgAdd(); } else { Toast.makeText(this, "Nie możesz dodać zdjęcia do postu, ponieważ nie zezwoliłeś aplikacji na dostęp do plików.", Toast.LENGTH_LONG).show(); } });
@SuppressLint("IntentReset")
public void imgAdd(){
if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");
startActivityForResult(pickIntent, 1);
} else {
requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == RESULT_OK) {
Bitmap bitmap = null;
if(data != null){
try{
imageData = data;
bitmap = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), imageData.getData());
Toast.makeText(this, helper.getThatPath(data.getData(), this), Toast.LENGTH_SHORT).show();
} catch (IOException ex){
ex.printStackTrace();
}
}
imageToPost.setImageBitmap(bitmap);
Toast.makeText(this, "Dodałem się", Toast.LENGTH_SHORT).show();
}
}
void uploadImage(int id_autor, int id_post, String dataDodania, Intent data) {
server.insert("posts_pictures", "NULL, '" + id_autor + "', '" + id_post + "', '" + helper.convertToBase64(data, this) + "', '" + dataDodania + "'");
}
}
@@ -0,0 +1,184 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PostsManagement extends AppCompatActivity {
LinearLayout postsList;
Server server;
public static int id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_posts_management);
server = new Server();
onLoad();
}
void onLoad(){
postsList = findViewById(R.id.postList);
id = Homepage.id;
refreshPosts();
}
void refreshPosts(){
ResultSet res = server.query("id_post, tresc, tytul, dataDodania", "posts", "id_autor = " + id, "ORDER BY id_post DESC");
try{
while(res.next()){
showPosts(
res.getInt(1),
res.getString(2),
res.getString(3),
res.getString(4)
);
}
} catch (SQLException ex){
ex.printStackTrace();
}
}
@SuppressLint({"SetTextI18n", "ResourceAsColor"})
public void showPosts(int id_post, String tresc, String title, String dataUtworzenia){
LinearLayout post = new LinearLayout(postsList.getContext());
LinearLayout.LayoutParams commentParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
commentParams.setMargins(0,4,8,4);
post.setLayoutParams(commentParams);
post.setId(View.generateViewId());
post.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout buttonGroup = new LinearLayout(post.getContext());
LinearLayout.LayoutParams btnGroupParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
buttonGroup.setLayoutParams(btnGroupParams);
buttonGroup.setId(View.generateViewId());
buttonGroup.setOrientation(LinearLayout.VERTICAL);
buttonGroup.setGravity(Gravity.CENTER);
LinearLayout postContent = new LinearLayout(post.getContext());
LinearLayout.LayoutParams commentsParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
postContent.setLayoutParams(commentsParams);
postContent.setId(View.generateViewId());
postContent.setOrientation(LinearLayout.VERTICAL);
ContextThemeWrapper theme = new ContextThemeWrapper(buttonGroup.getContext(), R.style.Widget_MaterialComponents_Button);
LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
buttonParams.setMargins(8,2,8,2);
Button editButton = new Button(theme);
editButton.setLayoutParams(buttonParams);
editButton.setId(View.generateViewId());
editButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.description_icon, 0,0,0);
editButton.setOnClickListener(view -> {
Intent intent = new Intent(this, EditPost.class);
intent.putExtra("post", id_post);
intent.putExtra("user", id);
startActivity(intent);
finish();
});
Button deleteButton = new Button(theme);
deleteButton.setLayoutParams(buttonParams);
deleteButton.setId(View.generateViewId());
deleteButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.delete_icon,0,0,0);
deleteButton.setOnClickListener(view -> {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
DialogInterface.OnClickListener alertDialog = (dialog, which) -> {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
server.delete("comments", "id_post = " + id_post);
server.delete("posts_likes", "id_post = " + id_post);
server.delete("posts_pictures", "id_post = " + id_post);
server.delete("posts", "id_post = " + id_post);
Toast.makeText(this, "Post został usunięty", Toast.LENGTH_SHORT).show();
postsList.removeAllViewsInLayout();
refreshPosts();
break;
case DialogInterface.BUTTON_NEGATIVE:
break;
}
};
alert.setMessage("Czy na pewno chcesz usunąć ten post?").setPositiveButton("Tak", alertDialog).setNegativeButton("Nie", alertDialog).show();
});
Button postButton = new Button(theme);
postButton.setLayoutParams(buttonParams);
postButton.setId(View.generateViewId());
postButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.gotopost_icon,0,0,0);
postButton.setOnClickListener(view -> {
Intent intent = new Intent(this, ThePost.class);
intent.putExtra("id_user", id);
intent.putExtra("id_post", id_post);
intent.putExtra("from", "edit");
startActivity(intent);
finish();
});
TextView postTitle = new TextView(postContent.getContext());
postTitle.setId(View.generateViewId());
postTitle.setText(title);
TextView postText = new TextView(postContent.getContext());
postText.setId(View.generateViewId());
postText.setTextAppearance(R.style.TextAppearance_AppCompat_Medium);
postText.setText(tresc);
TextView addedText = new TextView(postContent.getContext());
addedText.setId(View.generateViewId());
addedText.setTextAppearance(R.style.TextAppearance_AppCompat_Body2);
addedText.setText(dataUtworzenia);
View divider = new View(postsList.getContext());
TableRow.LayoutParams dividerParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, (int) getResources().getDisplayMetrics().density);
dividerParams.setMargins(32, 24, 32, 24);
divider.setLayoutParams(dividerParams);
divider.setBackgroundColor(getColor(R.color.gray_400));
buttonGroup.addView(editButton);
buttonGroup.addView(postButton);
buttonGroup.addView(deleteButton);
postContent.addView(postTitle);
postContent.addView(postText);
postContent.addView(addedText);
post.addView(buttonGroup);
post.addView(postContent);
postsList.addView(post);
postsList.addView(divider);
}
public void quit(View v){
Intent homepage = new Intent(this, Homepage.class);
startActivity(homepage);
finish();
}
@Override
public void onBackPressed(){
Intent homepage = new Intent(this, Homepage.class);
startActivity(homepage);
finish();
}
}
@@ -0,0 +1,354 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.tabs.TabLayout;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Profile extends AppCompatActivity {
int id;
int id_user;
Server server;
Helpers helper;
TextView nameText, usernameText, observedByText, descriptionText;
ImageView verifiedIcon, avatarImage;
Button observationBtn;
TabLayout navigationTab;
LinearLayout posts, comments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
onLoad();
changeTab();
}
void onLoad(){
nameText = findViewById(R.id.nameText);
usernameText = findViewById(R.id.usernameText);
observedByText = findViewById(R.id.observedByText);
verifiedIcon = findViewById(R.id.verifiedIcon);
observationBtn = findViewById(R.id.observationBtn);
navigationTab = findViewById(R.id.navigationTab);
descriptionText = findViewById(R.id.descriptionText);
avatarImage = findViewById(R.id.avatarImage);
comments = findViewById(R.id.comments);
posts = findViewById(R.id.posts);
id = Homepage.id;
server = new Server();
helper = new Helpers();
Bundle fromSomewhere = getIntent().getExtras();
id_user = fromSomewhere.getInt("id_user");
giveMeAll();
}
public void quitTheProfile(View v){
Intent intent = new Intent(this, Homepage.class);
startActivity(intent);
finish();
}
@Override
public void onBackPressed(){
Intent intent = new Intent(this, Homepage.class);
startActivity(intent);
finish();
}
public void changeTab(){
navigationTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch(tab.getPosition()){
case 0:
posts.setVisibility(View.VISIBLE);
break;
case 1:
comments.setVisibility(View.VISIBLE);
break;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
switch(tab.getPosition()){
case 0:
posts.setVisibility(View.GONE);
break;
case 1:
comments.setVisibility(View.GONE);
break;
}
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
@SuppressLint("SetTextI18n")
void giveMeAll(){
try{
ResultSet rsComments = server.query("DISTINCT users.username, comments.tresc, comments.dataUtworzenia, comments.id_post, posts.id_autor, comments.id_post", "comments, users, posts", "comments.id_author = " + id_user + " AND users.id = comments.id_author AND comments.id_post = posts.id_post", "ORDER BY comments.dataUtworzenia DESC");
while(rsComments.next()) {
String username = rsComments.getString(1);
String tresc = rsComments.getString(2);
String dataUtworzenia = rsComments.getString(3);
int id_post = rsComments.getInt(4);
ResultSet rsAuthor = server.query("users.username", "users", "users.id = " + rsComments.getInt(5));
while(rsAuthor.next())
showComments(
id_post,
username,
tresc,
dataUtworzenia,
rsAuthor.getString(1)
);
}
ResultSet rsPost = server.query("posts.id_post, users.username, posts.tresc, posts.dataDodania", "posts, users", "users.id = posts.id_autor AND posts.id_autor = " + id_user, "ORDER BY id_post DESC");
while(rsPost.next())
showPosts(
Integer.parseInt(rsPost.getString(1)),
rsPost.getString(2),
rsPost.getString(3),
rsPost.getString(4)
);
ResultSet rsUser = server.query("username, nazwaWyswietlana, zweryfikowany, opis, avatar", "users", "id = " + id_user);
while(rsUser.next()){
usernameText.setText(rsUser.getString(1));
nameText.setText(rsUser.getString(2));
descriptionText.setText(rsUser.getString(4));
if(rsUser.getInt(3) == 1)
verifiedIcon.setImageIcon(Icon.createWithResource(this, R.drawable.verified_icon));
else
verifiedIcon.setImageIcon(Icon.createWithResource(this, R.drawable.normaluser_icon));
if(rsUser.getString(5) != null) {
if(!rsUser.getString(5).matches(""))
avatarImage.setImageBitmap(helper.convertToBitmap(rsUser.getString(5)));
else
avatarImage.setImageIcon(Icon.createWithResource(this, R.drawable.default_avatar));
}else
avatarImage.setImageIcon(Icon.createWithResource(this, R.drawable.default_avatar));
}
ResultSet rsFollowers = server.query("COUNT(*)", "users_observations", "id_observedProfile = " + id_user);
while(rsFollowers.next())
observedByText.setText(rsFollowers.getInt(1) + " obserwujących");
if(id_user == id)
observationBtn.setVisibility(View.GONE);
else {
ResultSet rsObs = server.query("id_observation", "users_observations", "id_observedProfile = " + id_user + " AND id_observedBy = " + id);
if (rsObs.next()){
observationBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.observed_icon, 0,0,0);
} else
observationBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.observe_icon, 0,0,0);
}
}
catch (SQLException ex){
ex.printStackTrace();
}
}
public void observation(View v){
try{
ResultSet rs = server.query("id_observation", "users_observations", "id_observedProfile = " + id_user + " AND id_observedBy = " + id);
if(!rs.isBeforeFirst()){
server.insert("users_observations", "NULL, " + id_user + ", " + id_user + ", '" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "'");
Toast.makeText(this, "Zaobserwowano profil", Toast.LENGTH_SHORT).show();
observationBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.observed_icon, 0,0,0);
ResultSet rsFollowers = server.query("COUNT(*)", "users_observations", "id_observedProfile = " + id_user);
while(rsFollowers.next())
observedByText.setText(rsFollowers.getInt(1) + " obserwujących");
} else {
server.delete("users_observations", "id_observedProfile = " + id_user + " AND id_observedBy = " + id);
Toast.makeText(this, "Już nie obserwujesz tego profilu", Toast.LENGTH_SHORT).show();
observationBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.observe_icon, 0,0,0);
ResultSet rsFollowers = server.query("COUNT(*)", "users_observations", "id_observedProfile = " + id_user);
while(rsFollowers.next())
observedByText.setText(rsFollowers.getInt(1) + " obserwujących");
}
} catch(SQLException ex){
ex.printStackTrace();
}
}
@SuppressLint({"SetTextI18n", "ResourceAsColor"})
public void showPosts(int id_post, String autor, String text, String datetime){
TableLayout table = new TableLayout(posts.getContext());
TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT);
table.setId(View.generateViewId());
table.setLayoutParams(tableParams);
TableRow authorRow = new TableRow(table.getContext());
authorRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
TextView authorLabel = new TextView(authorRow.getContext());
authorLabel.setPadding(16,16,16,16);
authorLabel.setText(autor + " \nDodano: " + datetime);
/* */
TableRow textRow = new TableRow(table.getContext());
textRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
TextView textLabel = new TextView(textRow.getContext());
textLabel.setPadding(16,16,16,16);
textLabel.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
textLabel.setMaxLines(5);
textLabel.setTextSize(20f);
textLabel.setText(text);
/* */
TableRow likesRow = new TableRow(table.getContext());
likesRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.MATCH_PARENT));
Button goToPost = new Button(likesRow.getContext());
goToPost.setId(View.generateViewId());
TableRow.LayoutParams redirectParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, 96, 1f);
redirectParams.setMargins(16, 4, 16, 4);
goToPost.setBackgroundColor(ContextCompat.getColor(this, R.color.purple_500));
goToPost.setTextColor(Color.WHITE);
goToPost.setLayoutParams(redirectParams);
goToPost.setText("Pokaż cały post");
goToPost.setOnClickListener(
view -> {
Intent thePostIntent = new Intent(this, ThePost.class);
thePostIntent.putExtra("id_user", id);
thePostIntent.putExtra("id_post", id_post);
startActivity(thePostIntent);
}
);
View divider = new View(posts.getContext());
TableRow.LayoutParams dividerParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, (int) getResources().getDisplayMetrics().density);
dividerParams.setMargins(32, 32, 32, 32);
divider.setLayoutParams(dividerParams);
divider.setBackgroundColor(ContextCompat.getColor(this, R.color.gray_400));
likesRow.addView(goToPost);
textRow.addView(textLabel);
authorRow.addView(authorLabel);
table.addView(authorRow);
table.addView(textRow);
table.addView(likesRow);
posts.addView(table);
posts.addView(divider);
}
@SuppressLint("SetTextI18n")
void showComments(int id_post, String autor, String tresc, String dataUtworzenia, String autorPosta){
LinearLayout comment = new LinearLayout(comments.getContext());
LinearLayout.LayoutParams linParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
comment.setOrientation(LinearLayout.VERTICAL);
comment.setId(View.generateViewId());
comment.setLayoutParams(linParams);
TableRow.LayoutParams rowParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableRow authorRow = new TableRow(comment.getContext());
authorRow.setId(View.generateViewId());
authorRow.setLayoutParams(rowParams);
TextView authorText = new TextView(authorRow.getContext());
authorText.setId(View.generateViewId());
authorText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
authorText.setPadding(16, 16, 16, 4);
authorText.setText(autor + " odpowiedział " + autorPosta);
TableRow content = new TableRow(comment.getContext());
content.setId(View.generateViewId());
content.setLayoutParams(rowParams);
TextView contentText = new TextView(authorRow.getContext());
contentText.setId(View.generateViewId());
contentText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
contentText.setPadding(16, 4, 16, 4);
contentText.setAutoLinkMask(Linkify.ALL);
contentText.setMovementMethod(LinkMovementMethod.getInstance());
contentText.setText(tresc);
TableRow added = new TableRow(comment.getContext());
added.setId(View.generateViewId());
added.setLayoutParams(rowParams);
TextView addedText = new TextView(authorRow.getContext());
addedText.setId(View.generateViewId());
addedText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
addedText.setPadding(16, 4, 16, 16);
addedText.setText("Dodano " + dataUtworzenia);
Button goToPost = new Button(comments.getContext());
goToPost.setId(View.generateViewId());
TableRow.LayoutParams redirectParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, 96, 1f);
redirectParams.setMargins(16, 4, 16, 4);
goToPost.setBackgroundColor(ContextCompat.getColor(this, R.color.purple_500));
goToPost.setTextColor(Color.WHITE);
goToPost.setLayoutParams(redirectParams);
goToPost.setText("Pokaż cały post");
goToPost.setOnClickListener(
view -> {
Intent thePostIntent = new Intent(this, ThePost.class);
thePostIntent.putExtra("id_user", id);
thePostIntent.putExtra("id_post", id_post);
startActivity(thePostIntent);
}
);
View divider = new View(comments.getContext());
TableRow.LayoutParams dividerParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, (int) getResources().getDisplayMetrics().density);
dividerParams.setMargins(32, 32, 32, 32);
divider.setLayoutParams(dividerParams);
divider.setBackgroundColor(ContextCompat.getColor(this, R.color.gray_400));
authorRow.addView(authorText);
content.addView(contentText);
added.addView(addedText);
comment.addView(authorRow);
comment.addView(content);
comment.addView(added);
comments.addView(comment);
comments.addView(goToPost);
comments.addView(divider);
}
}
@@ -0,0 +1,153 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.view.View;
import java.sql.*;
import java.util.Calendar;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.widget.*;
public class Registration extends AppCompatActivity {
EditText nicknameBox, passwordBox, rpPasswordBox, nameBox, emailBox, phoneBox;
RadioButton maleBox, femaleBox;
TextView passwordIdentityText, birthdateBox, tosLink;
CheckBox acceptToS;
Button registerBtn;
String[] firstPartMale = {"Ambitny", "Zabawny", "Kreatywny", "Śmierdzacy", "Stanowczy", "Lojalny", "Dziwny", "Przyzwoity", "Przemądrzały", "Optymistyczny", "Pesymistyczny", "Zwariowany", "Zmarnowany", "Towarzyski", "Szczery", "Latający", "Aktywny", "Bezużyteczny", "Nieśmieszny"};
String[] secondPartMale = {"Dinozaur", "Robot", "Odkurzacz", "Tygrys", "Nerd", "Gracz", "Przegryw", "Król", "Kujon", "Kierowca", "Drifter", "Aparaciarz", "Zgredek"};
String[] firstPartFemale = {"Ambitna", "Zabawna", "Kreatywna", "Śmierdzaca", "Stanowcza", "Lojalna", "Dziwna", "Przyzwoita", "Przemądrzała", "Optymistyczna", "Pesymistyczna", "Zwariowana", "Zmarnowana", "Towarzyska", "Szczera", "Latająca", "Aktywna", "Bezużyteczna", "Nieśmieszna"};
String[] secondPartFemale = {"Dinozaur", "Robot", "Tygrysica", "Nerdini", "Graczka", "Przegrywka", "Królowa", "Kujonka", "Kierowczyni", "Drifterka", "Aparatka", "Zgredka"};
DatePickerDialog.OnDateSetListener dateSetListener;
Server server;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registration);
onLoad();
}
@SuppressLint("SetTextI18n")
void onLoad(){
nicknameBox = findViewById(R.id.usernameBar);
birthdateBox = findViewById(R.id.birthdateBox);
passwordBox = findViewById(R.id.passwordBox);
rpPasswordBox = findViewById(R.id.rpPasswordBox);
nameBox = findViewById(R.id.nameBox);
emailBox = findViewById(R.id.emailBox);
phoneBox = findViewById(R.id.phoneBox);
tosLink = findViewById(R.id.tosLink);
tosLink.setMovementMethod(LinkMovementMethod.getInstance());
server = new Server();
maleBox = findViewById(R.id.maleBtn);
femaleBox = findViewById(R.id.femaleBtn);
passwordIdentityText = findViewById(R.id.identityLogText);
registerBtn = findViewById(R.id.registerBtn);
acceptToS = findViewById(R.id.acceptToS);
dateSetListener = (datePicker, i, i1, i2) -> {
String year, month, day;
i1++;
month = (i1 < 10 ? "0" + i1 : Integer.toString(i1));
day = (i2 < 10 ? "0" + i2 : Integer.toString(i2));
year = Integer.toString(i);
birthdateBox.setText(year + "/" + month + "/" + day);
};
}
public void birthdateEvent(View v){
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(this, AlertDialog.THEME_HOLO_LIGHT, dateSetListener, year, month, day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
public void randomMeNickname(View v){
Random random = new Random();
StringBuilder x = new StringBuilder();
if(maleBox.isChecked()) {
x.append(firstPartMale[random.nextInt(firstPartMale.length)]);
x.append(secondPartMale[random.nextInt(secondPartMale.length)]);
} else {
x.append(firstPartFemale[random.nextInt(firstPartFemale.length)]);
x.append(secondPartFemale[random.nextInt(secondPartFemale.length)]);
}
x.append(random.nextInt(999));
nicknameBox.setText(x);
}
public void registerMe(View v){
int plec;
if(maleBox.isChecked())
plec = 1;
else
plec = 0;
Pattern p = Pattern.compile("[^A-Za-z0-9]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(nicknameBox.getText());
if(acceptToS.isChecked()) {
if(!m.find()) {
if (passwordBox.getText().toString().equals(rpPasswordBox.getText().toString())) {
if (!nicknameBox.getText().equals("") && !birthdateBox.getText().equals("")) {
if (nicknameBox.getText().length() > 3) {
try {
server.insert("users", "username, password, nazwaWyswietlana, email, numerTelefonu, dataUrodzenia, plec",
"'" + nicknameBox.getText() + "', PASSWORD('" + passwordBox.getText() + "'), '" + nameBox.getText() + "', '" + emailBox.getText() + "', '" + phoneBox.getText() + "', '" + birthdateBox.getText() + "', " + plec);
if (!nameBox.getText().equals("")) {
Toast.makeText(this, "Konto zostało utworzone. Witaj na pokładzie, " + nameBox.getText() + "!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Konto zostało utworzone. Witaj na pokładzie, " + nicknameBox.getText() + "!", Toast.LENGTH_SHORT).show();
}
ResultSet rs = server.query("id", "users", "username = '" + nicknameBox.getText() + "'");
while (rs.next()) {
Main.id = rs.getInt(1);
Intent intent = new Intent(this, Homepage.class);
startActivity(intent);
finish();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
} else Toast.makeText(this, "Za krótka nazwa użytkownika! Minimalnie 4 znaki.", Toast.LENGTH_LONG).show();
} else Toast.makeText(this, "Nazwa użytkownika jest wymagana! Jeżeli nie masz pomysłu, to wygeneruj sobie.", Toast.LENGTH_LONG).show();
} else Toast.makeText(this, "Wpisane hasła nie są identyczne, for blyat sake!", Toast.LENGTH_LONG).show();
} else Toast.makeText(this, "Nazwa użytkownika nie może zawierać znaków specjalnych. Jedynie litery oraz cyfry zezwolone!", Toast.LENGTH_LONG).show();
} else Toast.makeText(this, "Aby korzystać z serwisu musisz zakceptować regulamin!", Toast.LENGTH_LONG).show();
}
public void cancelRegistration(View v){
finish();
}
}
@@ -0,0 +1,109 @@
package pl.krzysiek.simplesocial;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Server {
String username = "";
String password = "";
String url = "jdbc:mysql://";
Connection conn;
public Connection connection(){
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException | ClassNotFoundException ex) {
ex.printStackTrace();
}
return conn;
}
public Statement stmt() {
Statement stmt = null;
try{ stmt = connection().createStatement(); } catch (SQLException ex) { ex.printStackTrace(); }
return stmt;
}
public ResultSet query(String columns, String from, String type, String table, String joinOn, String where, String args) {
ResultSet res = null;
try {
res = stmt().executeQuery("SELECT " + columns + " FROM " + from + " " + type + " JOIN " + table + " ON " + joinOn + " WHERE " + where + " " + args + ";");
} catch (SQLException ex){
ex.printStackTrace();
}
close();
return res;
}
public ResultSet query(String columns, String from, String type, String table, String joinOn, String where) {
ResultSet res = null;
try {
res = stmt().executeQuery("SELECT " + columns + " FROM " + from + " " + type + " JOIN " + table + " ON " + joinOn + " WHERE " + where + ";");
} catch (SQLException ex){
ex.printStackTrace();
}
close();
return res;
}
public ResultSet query(String columns, String from, String where, String args) {
ResultSet res = null;
try {
res = stmt().executeQuery("SELECT " + columns + " FROM " + from + " WHERE " + where + " " + args + ";");
} catch (SQLException ex){
ex.printStackTrace();
}
close();
return res;
}
public ResultSet query(String columns, String from, String where) {
ResultSet res = null;
try {
res = stmt().executeQuery("SELECT " + columns + " FROM " + from + " WHERE " + where + ";");
} catch (SQLException ex){
ex.printStackTrace();
}
close();
return res;
}
public ResultSet query(String columns, String from) {
ResultSet res = null;
try {
res = stmt().executeQuery("SELECT " + columns + " FROM " + from + ";");
} catch (SQLException ex){
ex.printStackTrace();
}
close();
return res;
}
public void update(String table, String changes, String where) {
try {stmt().executeUpdate("UPDATE " + table + " SET " + changes + " WHERE " + where + ";"); } catch (SQLException ex) { ex.printStackTrace(); }
close();
}
public void delete(String from, String where){
try { stmt().executeUpdate("DELETE FROM " + from + " WHERE " + where + ";"); } catch (SQLException ex) { ex.printStackTrace(); }
close();
}
public void insert(String table, String columns, String values){
try {stmt().executeUpdate("INSERT INTO " + table + "(" + columns + ") VALUES(" + values + ");"); } catch (SQLException ex) { ex.printStackTrace(); }
close();
}
public void insert(String table, String values){
try {stmt().executeUpdate("INSERT INTO " + table + " VALUES(" + values + ");"); } catch (SQLException ex) { ex.printStackTrace(); }
close();
}
public void close(){
try{ connection().close(); } catch (SQLException ex) { ex.printStackTrace(); }
}
}
@@ -0,0 +1,235 @@
package pl.krzysiek.simplesocial;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class ThePost extends AppCompatActivity {
int id_user;
int id_post;
int id_author;
String from;
ImageView postImage, avatarView;
Server server;
Helpers helper;
TextView author, createDate, contentOfPost, likes, title;
EditText commentBox;
Button likeBtn, observationBtn;
LinearLayout linearLayout;
LinearLayout comments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.thepost);
onLoad();
updateThePost();
refreshComments();
}
void onLoad(){
Bundle homepage = getIntent().getExtras();
id_user = homepage.getInt("id_user");
id_post = homepage.getInt("id_post");
from = homepage.getString("from");
server = new Server();
helper = new Helpers();
author = findViewById(R.id.userText);
createDate = findViewById(R.id.createDateText);
observationBtn = findViewById(R.id.observeBtn);
postImage = findViewById(R.id.postImage);
contentOfPost = findViewById(R.id.contentText);
contentOfPost.setMovementMethod(LinkMovementMethod.getInstance());
title = findViewById(R.id.titleText);
avatarView = findViewById(R.id.avatarView);
likes = findViewById(R.id.likesText);
likeBtn = findViewById(R.id.likeBtn);
commentBox = findViewById(R.id.commentBox);
comments = findViewById(R.id.comments);
linearLayout = findViewById(R.id.postLayout);
}
@SuppressLint("SetTextI18n")
void updateThePost(){
int typ = 0;
try{
ResultSet rsPost = server.query("users.username, posts.dataDodania, posts.tresc, posts.id_autor, posts.tytul, posts.typPosta, users.avatar", "posts, users", "posts.id_post = " + id_post + " AND users.id = posts.id_autor");
while(rsPost.next()){
author.setText(rsPost.getString(1));
createDate.setText("Dodano " + rsPost.getString(2));
contentOfPost.setText(rsPost.getString(3));
id_author = rsPost.getInt(4);
title.setText(rsPost.getString(5));
typ = rsPost.getInt(6);
if(rsPost.getString(7) != null) {
if(!rsPost.getString(7).matches(""))
avatarView.setImageBitmap(helper.convertToBitmap(rsPost.getString(7)));
else
avatarView.setImageIcon(Icon.createWithResource(this, R.drawable.default_avatar));
} else
avatarView.setImageIcon(Icon.createWithResource(this, R.drawable.default_avatar));
}
ResultSet rsLikes = server.query("COUNT(*)", "posts_likes", "id_post = " + id_post);
while(rsLikes.next()){
likes.setText(rsLikes.getString(1));
}
if(typ > 0){
ResultSet rsImage = server.query("picture", "posts_pictures", "id_post = " + id_post + " AND id_autor = " + id_author);
while(rsImage.next()) {
postImage.setImageBitmap(helper.convertToBitmap(rsImage.getString(1)));
}
}
if(id_author == id_user)
observationBtn.setVisibility(View.GONE);
else {
ResultSet rsObs = server.query("id_observation", "users_observations", "id_observedProfile = " + id_author + " AND id_observedBy = " + id_user);
if(!rsObs.isBeforeFirst())
observationBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.observe_icon, 0,0,0);
else
observationBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.observed_icon, 0,0,0);
}
ResultSet rs = server.query("id_like", "posts_likes", "id_post = " + id_post + " AND id_user = " + id_user + ";");
if(!rs.next())
likeBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.like_icon, 0, 0, 0);
else
likeBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.liked_icon, 0, 0, 0);
} catch (SQLException ex){
ex.printStackTrace();
}
}
public void goToProfile(View v){
Intent intent = new Intent(this, Profile.class);
intent.putExtra("id_user", id_author);
startActivity(intent);
}
public void giveAComment(View v){
if(!title.getText().toString().matches("")) {
server.insert("comments", "NULL, " + id_post + ", " + id_user + ", NOW(), '" + commentBox.getText() + "', 0");
commentBox.setText("");
refreshComments();
Toast.makeText(this, "Komentarz dodany!", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Nie można dodawać pustych komentarzy", Toast.LENGTH_SHORT).show();
}
}
void refreshComments(){
try{
ResultSet rs = server.query("users.username, comments.tresc, comments.dataUtworzenia", "comments, users", "comments.id_post = " + id_post + " AND users.id = comments.id_author", "ORDER BY comments.dataUtworzenia DESC");
comments.removeAllViewsInLayout();
while(rs.next())
helper.GenerateComments(
comments,
rs.getString(1),
getBaseContext(),
rs.getString(2),
rs.getString(3),
author
);
Toast.makeText(this, "Pomyślnie zaktualizowano!", Toast.LENGTH_SHORT).show();
}
catch (SQLException ex){
ex.printStackTrace();
}
}
public void giveALike(View v){
try{
ResultSet rs = server.query("id_like", "posts_likes", "id_post = " + id_post + " AND id_user = " + id_user);
if(!rs.isBeforeFirst()){
server.insert("posts_likes", "NULL, " + id_post + ", " + id_user + ", '" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "'");
likeBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.liked_icon, 0, 0, 0);
} else {
server.delete("posts_likes", "id_post = " + id_post + " AND id_user = " + id_user + ";");
likeBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.like_icon, 0, 0, 0);
}
ResultSet rsLikes = server.query("COUNT(*)", "posts_likes", "id_post = " + id_post);
while(rsLikes.next()){
likes.setText(rsLikes.getString(1));
}
}
catch(SQLException ex){
ex.printStackTrace();
}
}
public void observation(View v){
try{
ResultSet rs = server.query("id_observation", "users_observations", "id_observedProfile = " + id_author + " AND id_observedBy = " + id_user);
if(!rs.isBeforeFirst()){
server.insert("users_observations", "NULL, " + id_author + ", " + id_user + ", '" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "'");
Toast.makeText(this, "Zaobserwowano profil", Toast.LENGTH_SHORT).show();
observationBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.observed_icon, 0,0,0);
} else {
server.delete("users_observations", "id_observedProfile = " + id_author + " AND id_observedBy = " + id_user);
Toast.makeText(this, "Już nie obserwujesz tego profilu", Toast.LENGTH_SHORT).show();
observationBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.observe_icon, 0,0,0);
}
} catch(SQLException ex){
ex.printStackTrace();
}
}
public void exitPost(View v){
Intent parent = null;
switch (from) {
case "homepage":
parent = new Intent(this, Homepage.class);
break;
case "user":
parent = new Intent(this, Profile.class);
parent.putExtra("id_user", id_author);
break;
case "edit":
parent = new Intent(this, PostsManagement.class);
break;
case "comment":
parent = new Intent(this, CommentsManagement.class);
parent.putExtra("user", id_user);
break;
}
startActivity(parent);
finish();
}
}
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM19,11h-4v4h-2v-4L9,11L9,9h4L13,5h2v4h4v2z"/>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM7.07,18.28c0.43,-0.9 3.05,-1.78 4.93,-1.78s4.51,0.88 4.93,1.78C15.57,19.36 13.86,20 12,20s-3.57,-0.64 -4.93,-1.72zM18.36,16.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33C4.62,15.49 4,13.82 4,12c0,-4.41 3.59,-8 8,-8s8,3.59 8,8c0,1.82 -0.62,3.49 -1.64,4.83zM12,6c-1.94,0 -3.5,1.56 -3.5,3.5S10.06,13 12,13s3.5,-1.56 3.5,-3.5S13.94,6 12,6zM12,11c-0.83,0 -1.5,-0.67 -1.5,-1.5S11.17,8 12,8s1.5,0.67 1.5,1.5S12.83,11 12,11z"/>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M21.99,4c0,-1.1 -0.89,-2 -1.99,-2H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18z"/>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
</vector>
@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6"
android:autoMirrored="true">
<path
android:fillColor="@android:color/white"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>
</vector>
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<group android:scaleX="1.2"
android:scaleY="1.2"
android:translateX="-2.4"
android:translateY="-1.8">
<path
android:fillColor="@android:color/white"
android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"/>
</group>
</vector>
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<group android:scaleX="1.0909091"
android:scaleY="1.0909091"
android:translateX="-1.0909091">
<path
android:fillColor="@android:color/white"
android:pathData="M9,21h9c0.83,0 1.54,-0.5 1.84,-1.22l3.02,-7.05c0.09,-0.23 0.14,-0.47 0.14,-0.73v-2c0,-1.1 -0.9,-2 -2,-2h-6.31l0.95,-4.57 0.03,-0.32c0,-0.41 -0.17,-0.79 -0.44,-1.06L14.17,1 7.58,7.59C7.22,7.95 7,8.45 7,9v10c0,1.1 0.9,2 2,2zM9,9l4.34,-4.34L12,10h9v2l-3,7H9V9zM1,9h4v12H1z"/>
</group>
</vector>
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<group android:scaleX="1.0909091"
android:scaleY="1.0909091"
android:translateX="-1.0909091">
<path
android:fillColor="@android:color/white"
android:pathData="M1,21h4L5,9L1,9v12zM23,10c0,-1.1 -0.9,-2 -2,-2h-6.31l0.95,-4.57 0.03,-0.32c0,-0.41 -0.17,-0.79 -0.44,-1.06L14.17,1 7.59,7.59C7.22,7.95 7,8.45 7,9v10c0,1.1 0.9,2 2,2h9c0.83,0 1.54,-0.5 1.84,-1.22l3.02,-7.05c0.09,-0.23 0.14,-0.47 0.14,-0.73v-2z"/>
</group>
</vector>
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<group android:scaleX="1.2"
android:scaleY="1.2"
android:translateX="-2.4"
android:translateY="-2.4">
<path
android:fillColor="@android:color/white"
android:pathData="M11,7L9.6,8.4l2.6,2.6H2v2h10.2l-2.6,2.6L11,17l5,-5L11,7zM20,19h-8v2h8c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2h-8v2h8V19z"/>
</group>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
</vector>
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<group android:scaleX="1.5"
android:scaleY="1.5"
android:translateX="-6"
android:translateY="-6">
<path
android:fillColor="@android:color/white"
android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</group>
</vector>
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<group android:scaleX="1.0909091"
android:scaleY="1.0909091"
android:translateX="-1.0909091"
android:translateY="-1.0909091">
<path
android:fillColor="@android:color/white"
android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM15,6c1.1,0 2,0.9 2,2s-0.9,2 -2,2 -2,-0.9 -2,-2 0.9,-2 2,-2zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4zM9,18c0.22,-0.72 3.31,-2 6,-2 2.7,0 5.8,1.29 6,2L9,18zM6,15v-3h3v-2L6,10L6,7L4,7v3L1,10v2h3v3z"/>
</group>
</vector>
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<group android:scaleX="1.0909091"
android:scaleY="1.0909091"
android:translateX="-1.0909091"
android:translateY="-1.0909091">
<path
android:fillColor="@android:color/white"
android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</group>
</vector>
@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6"
android:autoMirrored="true">
<path
android:fillColor="@android:color/white"
android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z"/>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"/>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>
@@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6"
android:autoMirrored="true">
<group android:scaleX="1.1428572"
android:scaleY="1.1428572"
android:translateX="-2.2857144"
android:translateY="-1.7142857">
<path
android:fillColor="@android:color/white"
android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/>
</group>
</vector>
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<group android:scaleX="1.0909091"
android:scaleY="1.0909091"
android:translateX="-1.0909091"
android:translateY="-1.0909091">
<path
android:fillColor="@android:color/white"
android:pathData="M23,12l-2.44,-2.79l0.34,-3.69l-3.61,-0.82L15.4,1.5L12,2.96L8.6,1.5L6.71,4.69L3.1,5.5L3.44,9.2L1,12l2.44,2.79l-0.34,3.7l3.61,0.82L8.6,22.5l3.4,-1.47l3.4,1.46l1.89,-3.19l3.61,-0.82l-0.34,-3.69L23,12zM10.09,16.72l-3.8,-3.81l1.48,-1.48l2.32,2.33l5.85,-5.87l1.48,1.48L10.09,16.72z"/>
</group>
</vector>
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333"
android:alpha="0.6">
<path
android:fillColor="@android:color/white"
android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/>
</vector>
Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 B

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 B

Some files were not shown because too many files have changed in this diff Show More