11package com .example .caden .drawingtest ;
22
33import android .annotation .SuppressLint ;
4+ import android .content .Intent ;
45import android .content .res .ColorStateList ;
56import android .graphics .Bitmap ;
67import android .graphics .Color ;
1314import android .support .v7 .app .AppCompatActivity ;
1415import android .support .v7 .widget .Toolbar ;
1516import android .transition .TransitionManager ;
16- import android .util .Log ;
1717import android .util .TypedValue ;
1818import android .view .Menu ;
1919import android .view .MenuItem ;
2020import android .view .MotionEvent ;
2121import android .view .View ;
2222import android .widget .Button ;
2323import android .widget .ProgressBar ;
24+ import android .widget .TextView ;
2425
2526import com .flask .colorpicker .ColorPickerView ;
2627import com .flask .colorpicker .builder .ColorPickerDialogBuilder ;
2728import com .google .firebase .auth .FirebaseAuth ;
2829import com .google .firebase .auth .FirebaseUser ;
30+ import com .google .firebase .database .DataSnapshot ;
31+ import com .google .firebase .database .DatabaseError ;
2932import com .google .firebase .database .DatabaseReference ;
3033import com .google .firebase .database .FirebaseDatabase ;
34+ import com .google .firebase .database .ValueEventListener ;
3135import com .google .firebase .storage .FirebaseStorage ;
3236import com .google .firebase .storage .StorageMetadata ;
3337import com .google .firebase .storage .StorageReference ;
3741import java .text .DateFormat ;
3842import java .text .SimpleDateFormat ;
3943import java .util .Date ;
44+ import java .util .HashMap ;
45+ import java .util .Map ;
46+ import java .util .Random ;
47+ import java .util .Set ;
4048import java .util .UUID ;
4149
4250public 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}
0 commit comments