Skip to content

Commit d8af2e4

Browse files
committed
Release 1.0
1 parent 7775bf4 commit d8af2e4

File tree

17 files changed

+233
-45
lines changed

17 files changed

+233
-45
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ android {
2323
}
2424
productFlavors {
2525
}
26+
lintOptions {
27+
checkReleaseBuilds false
28+
}
2629
}
2730

2831
dependencies {

app/release/output.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"app-release.apk","properties":{"packageId":"com.example.caden.drawingtest","split":"","minSdkVersion":"23"}}]

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
</intent-filter>
2626
</activity>
2727

28+
<activity
29+
android:name=".DrawingActivity"
30+
android:screenOrientation="portrait"
31+
android:theme="@style/AppTheme.NoActionBar" />
32+
2833
<activity
2934
android:name=".RegistrationActivity"
3035
android:screenOrientation="portrait"
@@ -40,11 +45,6 @@
4045
android:screenOrientation="portrait"
4146
android:theme="@style/AppTheme"/>
4247

43-
<activity
44-
android:name=".DrawingActivity"
45-
android:screenOrientation="portrait"
46-
android:theme="@style/AppTheme.NoActionBar" />
47-
4848
</application>
4949

5050
</manifest>

app/src/main/java/com/example/caden/drawingtest/DrawActivity.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ private void clearAll(){
131131
// important, you have to call the invalidate view before you start doing stuff
132132
invalidate();
133133
addBackground();
134-
135134
}
136135

137136
@Override

app/src/main/java/com/example/caden/drawingtest/DrawView.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import android.graphics.Rect;
1212
import android.support.annotation.Nullable;
1313
import android.util.AttributeSet;
14+
import android.util.Log;
1415
import android.view.View;
1516

1617
/**
@@ -54,13 +55,19 @@ public void reset() {
5455
}
5556
}
5657

57-
private void addBackground() {
58-
Bitmap img = BitmapFactory.decodeByteArray(ImageManager.imgData, 0, ImageManager.imgData.length);
58+
public void addBackground() {
59+
// TODO Initialization there might be no image
60+
if (ImageManager.imgData != null) {
61+
Log.d("DRAWVIEW", "IMAGE DATA IS NOT NULL");
62+
Bitmap img = BitmapFactory.decodeByteArray(ImageManager.imgData, 0, ImageManager.imgData.length);
5963
// use the width of the screen, and for height, scale it proportional to how much width was scaled
60-
Rect dest = new Rect(0, 0, mOffscreenBitmap.getWidth(), img.getHeight() * (mOffscreenBitmap.getWidth()/img.getWidth()));
61-
Paint paint = new Paint();
62-
paint.setFilterBitmap(true);
63-
mOffscreenCanvas.drawBitmap(img, null, dest, paint);
64+
Rect dest = new Rect(0, 0, mOffscreenBitmap.getWidth(), img.getHeight() * (mOffscreenBitmap.getWidth()/img.getWidth()));
65+
Paint paint = new Paint();
66+
paint.setFilterBitmap(true);
67+
mOffscreenCanvas.drawBitmap(img, null, dest, paint);
68+
} else {
69+
Log.d("DRAWVIEW", "IMAGE DATA IS NULL");
70+
}
6471
}
6572

6673
//create the view, for a given length and width

app/src/main/java/com/example/caden/drawingtest/DrawingActivity.java

Lines changed: 137 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.caden.drawingtest;
22

33
import android.annotation.SuppressLint;
4+
import android.content.Intent;
45
import android.content.res.ColorStateList;
56
import android.graphics.Bitmap;
67
import android.graphics.Color;
@@ -13,21 +14,24 @@
1314
import android.support.v7.app.AppCompatActivity;
1415
import android.support.v7.widget.Toolbar;
1516
import android.transition.TransitionManager;
16-
import android.util.Log;
1717
import android.util.TypedValue;
1818
import android.view.Menu;
1919
import android.view.MenuItem;
2020
import android.view.MotionEvent;
2121
import android.view.View;
2222
import android.widget.Button;
2323
import android.widget.ProgressBar;
24+
import android.widget.TextView;
2425

2526
import com.flask.colorpicker.ColorPickerView;
2627
import com.flask.colorpicker.builder.ColorPickerDialogBuilder;
2728
import com.google.firebase.auth.FirebaseAuth;
2829
import com.google.firebase.auth.FirebaseUser;
30+
import com.google.firebase.database.DataSnapshot;
31+
import com.google.firebase.database.DatabaseError;
2932
import com.google.firebase.database.DatabaseReference;
3033
import com.google.firebase.database.FirebaseDatabase;
34+
import com.google.firebase.database.ValueEventListener;
3135
import com.google.firebase.storage.FirebaseStorage;
3236
import com.google.firebase.storage.StorageMetadata;
3337
import com.google.firebase.storage.StorageReference;
@@ -37,13 +41,23 @@
3741
import java.text.DateFormat;
3842
import java.text.SimpleDateFormat;
3943
import java.util.Date;
44+
import java.util.HashMap;
45+
import java.util.Map;
46+
import java.util.Random;
47+
import java.util.Set;
4048
import java.util.UUID;
4149

4250
public class DrawingActivity extends AppCompatActivity implements View.OnTouchListener {
4351

4452
/* Constants */
4553
int dp56;
4654

55+
/* Variables */
56+
String currBatchName;
57+
int currBatchSize;
58+
int currImgNo;
59+
Map uploadsDict;
60+
4761
// views
4862
private DrawModel drawModel;
4963
private DrawView drawView;
@@ -56,15 +70,16 @@ public class DrawingActivity extends AppCompatActivity implements View.OnTouchLi
5670
int brushColor;
5771
Button btnBrushColor;
5872

59-
60-
// FireBase
73+
/* FireBase */
6174
private FirebaseStorage mStorage;
6275
private FirebaseAuth mAuth;
6376
private DatabaseReference mDatabase;
6477

6578
Toolbar toolbar;
66-
private ProgressBar barSend;
67-
private FloatingActionButton fabSend;
79+
ProgressBar barSend;
80+
FloatingActionButton fabSend;
81+
TextView tvUserEmail;
82+
TextView tvImageName;
6883

6984
ConstraintLayout clDrawMain;
7085
ConstraintSet constraintSet = new ConstraintSet();
@@ -79,41 +94,56 @@ protected void onCreate(Bundle savedInstanceState) {
7994
toolbar = findViewById(R.id.drawing_toolbar);
8095
setSupportActionBar(toolbar);
8196

97+
im = new ImageManager();
98+
mStorage = FirebaseStorage.getInstance();
99+
mAuth = FirebaseAuth.getInstance();
100+
mDatabase = FirebaseDatabase.getInstance().getReference();
101+
102+
brushColor = Color.parseColor("#FF2646");
103+
ImageManager.setBrushColor(brushColor);
104+
105+
FirebaseUser user = mAuth.getCurrentUser();
106+
82107
//get drawing view from XML (where the finger writes the number)
83108
drawView = findViewById(R.id.draw);
109+
110+
// TODO where i put this function is very important!! due to firebase async!!
111+
fireBaseRetrieveImage();
112+
84113
//get the model object
85114
drawModel = new DrawModel(PIXEL_WIDTH, PIXEL_WIDTH);
86115
btnBrushColor = findViewById(R.id.btn_brush_color);
87116
// brushColor = btnBrushColor.getBackgroundTintList();
88117
clDrawMain = findViewById(R.id.cl_draw_main);
118+
tvUserEmail = findViewById(R.id.tv_user_email);
119+
tvUserEmail.setText(user.getEmail());
120+
tvImageName = findViewById(R.id.tv_img_name);
121+
89122
constraintSet.clone(clDrawMain);
90123
dp56 = dpToPx(56);
124+
fabSend = findViewById(R.id.fab_send);
125+
barSend = findViewById(R.id.pbar_send);
91126

92127
//init the view with the model object
93128
drawView.setModel(drawModel);
94129
// give it a touch listener to activate when the user taps
95130
drawView.setOnTouchListener(this);
96-
97-
im = new ImageManager();
98-
99-
fabSend = findViewById(R.id.fab_send);
100-
barSend = findViewById(R.id.pbar_send);
101-
102-
mStorage = FirebaseStorage.getInstance();
103-
mAuth = FirebaseAuth.getInstance();
104-
mDatabase = FirebaseDatabase.getInstance().getReference();
105131
}
106132

107133
@Override
108134
public boolean onCreateOptionsMenu(Menu menu) {
109-
getMenuInflater().inflate(R.menu.standard_menu, menu);
135+
getMenuInflater().inflate(R.menu.drawing_menu, menu);
110136
return true;
111137
}
112138

113139
@Override
114140
public boolean onOptionsItemSelected(MenuItem item) {
115141
if (item.getItemId() == R.id.menu_info) {
116142
about_screen();
143+
} else if (item.getItemId() == R.id.menu_sign_out) {
144+
FirebaseAuth.getInstance().signOut();
145+
Intent i = new Intent(this, LoginActivity.class);
146+
startActivity(i);
117147
}
118148
return super.onOptionsItemSelected(item);
119149
}
@@ -242,7 +272,7 @@ public void sendImage(View v) {
242272
FirebaseUser u = mAuth.getCurrentUser();
243273

244274
/* Upload Drawing */
245-
String path = "uploaded/" + imageFileName + "/" + uploadFormat.format(date) + "/" + uuid + ".jpg";
275+
String path = "uploaded/" + currBatchName + "/" + currImgNo + "/" + uuid + ".jpg";
246276
StorageReference mStorageRef = mStorage.getReference(path);
247277

248278
StorageMetadata metadata = new StorageMetadata.Builder()
@@ -258,12 +288,20 @@ public void sendImage(View v) {
258288
constraintSet.constrainHeight(R.id.cv_drawview, dvHeight);
259289
constraintSet.constrainHeight(R.id.drawing_ll, 0);
260290
constraintSet.applyTo(clDrawMain);
291+
// Load the next one
292+
nextImage(v);
261293
});
262294

263295
/* Update Database Reference */
264-
mDatabase.child(imageFileName).child(dateFormat.format(date)).child(timeFormat.format(date)).child("image_name").setValue(uuid.toString());
265-
mDatabase.child(imageFileName).child(dateFormat.format(date)).child(timeFormat.format(date)).child("user_email").setValue(u.getEmail());
266-
mDatabase.child(imageFileName).child(dateFormat.format(date)).child(timeFormat.format(date)).child("user_uid").setValue(u.getUid());
296+
mDatabase.child("uploads").child(currBatchName).child(String.valueOf(currImgNo)).child(dateFormat.format(date))
297+
.child(timeFormat.format(date)).child("image_name").setValue(uuid.toString());
298+
mDatabase.child("uploads").child(currBatchName).child(String.valueOf(currImgNo)).child(dateFormat.format(date))
299+
.child(timeFormat.format(date)).child("user_email").setValue(u.getEmail());
300+
mDatabase.child("uploads").child(currBatchName).child(String.valueOf(currImgNo)).child(dateFormat.format(date))
301+
.child(timeFormat.format(date)).child("user_uid").setValue(u.getUid());
302+
// mDatabase.child(imageFileName).child(dateFormat.format(date)).child(timeFormat.format(date)).child("image_name").setValue(uuid.toString());
303+
// mDatabase.child(imageFileName).child(dateFormat.format(date)).child(timeFormat.format(date)).child("user_email").setValue(u.getEmail());
304+
// mDatabase.child(imageFileName).child(dateFormat.format(date)).child(timeFormat.format(date)).child("user_uid").setValue(u.getUid());
267305
}
268306

269307
public void changeColor(View v) {
@@ -285,6 +323,78 @@ public void changeColor(View v) {
285323
.show();
286324
}
287325

326+
private void fireBaseRetrieveImage() {
327+
mDatabase.child("master_upload").addListenerForSingleValueEvent(new ValueEventListener() {
328+
@Override
329+
public void onDataChange(DataSnapshot dataSnapshot) {
330+
initWithImage((HashMap)dataSnapshot.getValue());
331+
}
332+
@Override
333+
public void onCancelled(DatabaseError databaseError) {
334+
335+
}
336+
});
337+
}
338+
339+
@SuppressLint("DefaultLocale")
340+
private void initWithImage(HashMap dict) {
341+
// Update
342+
uploadsDict = dict;
343+
Set keys = dict.keySet();
344+
int keyLen = keys.size();
345+
String[] keyArray = (String[]) keys.toArray(new String[keyLen]);
346+
Random rand = new Random();
347+
// TODO set is 0 based need to go from 0 to len - 1
348+
int randKey = rand.nextInt(keyLen);
349+
350+
currBatchName = keyArray[randKey];
351+
352+
// FIXME HARDCODED CHANGE, use currBATCHNAME INSTEAD
353+
// currBatchName = "2017-09-23";
354+
currBatchSize = longToInt((Long) dict.get(currBatchName));
355+
356+
currImgNo = rand.nextInt(currBatchSize) + 1;
357+
358+
tvImageName.setText(String.format("%s / %d.png", currBatchName, currImgNo));
359+
360+
// FIXME load the image, check this code for errors!
361+
/* Load Drawing */
362+
String path = String.format("img/%s/%d.png", currBatchName, currImgNo);
363+
StorageReference mStorageRef = mStorage.getReference(path);
364+
365+
final long ONE_KILOBYTE = 1024;
366+
mStorageRef.getBytes(ONE_KILOBYTE).addOnSuccessListener(bytes -> {
367+
im.setImage(bytes);
368+
clear(findViewById(R.id.cl_draw_main));
369+
}).addOnFailureListener(exception -> {
370+
// Handle any errors
371+
});
372+
}
373+
374+
public void nextImage(View v) {
375+
Set keys = uploadsDict.keySet();
376+
int keyLen = keys.size();
377+
String[] keyArray = (String[]) keys.toArray(new String[keyLen]);
378+
Random rand = new Random();
379+
int randKey = rand.nextInt(keyLen);
380+
currBatchName = keyArray[randKey];
381+
currBatchSize = longToInt((Long) uploadsDict.get(currBatchName));
382+
currImgNo = rand.nextInt(currBatchSize) + 1;
383+
tvImageName.setText(String.format("%s / %d.png", currBatchName, currImgNo));
384+
385+
/* Load Drawing */
386+
String path = String.format("img/%s/%d.png", currBatchName, currImgNo);
387+
StorageReference mStorageRef = mStorage.getReference(path);
388+
389+
final long ONE_KILOBYTE = 1024;
390+
mStorageRef.getBytes(ONE_KILOBYTE).addOnSuccessListener(bytes -> {
391+
im.setImage(bytes);
392+
clear(v);
393+
}).addOnFailureListener(exception -> {
394+
// Handle any errors
395+
});
396+
}
397+
288398
/**
289399
* Converts dp into pixel values
290400
* @param dp display pixels
@@ -294,4 +404,12 @@ private int dpToPx(int dp) {
294404
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
295405
dp, getResources().getDisplayMetrics());
296406
}
407+
408+
private int longToInt(long l) {
409+
if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
410+
throw new IllegalArgumentException
411+
(l + " cannot be cast to int without changing its value.");
412+
}
413+
return (int) l;
414+
}
297415
}

app/src/main/java/com/example/caden/drawingtest/LoginActivity.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public void register(View v){
9797
}
9898

9999
public void updateUI() {
100-
Intent i = new Intent(this, MainActivity.class);
100+
Intent i = new Intent(this, DrawingActivity.class);
101101
startActivity(i);
102102
}
103103

@@ -114,7 +114,6 @@ public void onClick(View v) {
114114
@Override
115115
public void onActivityResult(int requestCode, int resultCode, Intent data) {
116116
super.onActivityResult(requestCode, resultCode, data);
117-
118117
if (requestCode == RC_SIGN_IN) {
119118
progressbar.setVisibility(View.VISIBLE);
120119
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);

app/src/main/java/com/example/caden/drawingtest/MainActivity.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ private void img_v_touch_handler() {
114114
}).addOnFailureListener(exception -> {
115115
// Handle any errors
116116
});
117-
118117
}
119118

120119
public boolean onTouchEvent(MotionEvent event) {
@@ -128,8 +127,8 @@ public boolean onTouchEvent(MotionEvent event) {
128127

129128
public void transition(View v) {
130129
Intent i = new Intent(this, DrawActivity.class);
131-
i.putExtra("thickness", sb.getProgress());
132-
i.putExtra("color", brushColor);
130+
// i.putExtra("thickness", sb.getProgress());
131+
// i.putExtra("color", brushColor);
133132
startActivity(i);
134133
}
135134

app/src/main/java/com/example/caden/drawingtest/RegistrationActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public void registerUser(View v) {
8888
}
8989

9090
private void transition() {
91-
Intent i = new Intent(this, MainActivity.class);
91+
Intent i = new Intent(this, DrawingActivity.class);
9292
startActivity(i);
9393
}
9494
}

0 commit comments

Comments
 (0)