Commit 9c431985f72992e326242adb85697b35bb2a132b
1 parent
260f822ff9
Exists in
master
ipdate
Showing 8 changed files with 266 additions and 52 deletions Side-by-side Diff
- app/src/main/AndroidManifest.xml
- app/src/main/java/com/dinhcv/lifelogpedometer/activity/PedometerActivity.java
- app/src/main/java/com/dinhcv/lifelogpedometer/activity/RegisterActivity.java
- app/src/main/java/com/dinhcv/lifelogpedometer/activity/WelcomeActivity.java
- app/src/main/java/com/dinhcv/lifelogpedometer/portal/LLAPIManager.java
- app/src/main/java/com/dinhcv/lifelogpedometer/portal/RequestPostImage.java
- app/src/main/res/drawable/add_ic.PNG
- app/src/main/res/layout/activity_register.xml
app/src/main/AndroidManifest.xml
... | ... | @@ -10,6 +10,7 @@ |
10 | 10 | <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> |
11 | 11 | <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> |
12 | 12 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
13 | + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | |
13 | 14 | <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> |
14 | 15 | <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> |
15 | 16 | <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> |
app/src/main/java/com/dinhcv/lifelogpedometer/activity/PedometerActivity.java
... | ... | @@ -27,6 +27,7 @@ |
27 | 27 | |
28 | 28 | import com.dinhcv.lifelogpedometer.R; |
29 | 29 | import com.dinhcv.lifelogpedometer.model.Shareprefer.Setting; |
30 | +import com.dinhcv.lifelogpedometer.portal.APIResponse; | |
30 | 31 | import com.dinhcv.lifelogpedometer.utils.Debug; |
31 | 32 | import com.dinhcv.lifelogpedometer.utils.Utils; |
32 | 33 | |
... | ... | @@ -397,6 +398,7 @@ |
397 | 398 | private void logout(){ |
398 | 399 | // clear data |
399 | 400 | Setting.clearUserIdSharepre(PedometerActivity.this); |
401 | + APIResponse.getInstance().setToken(null); | |
400 | 402 | // go to login |
401 | 403 | Intent intent = new Intent(PedometerActivity.this, LoginActivity.class); |
402 | 404 | intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); |
app/src/main/java/com/dinhcv/lifelogpedometer/activity/RegisterActivity.java
... | ... | @@ -323,11 +323,12 @@ |
323 | 323 | } |
324 | 324 | |
325 | 325 | @Override |
326 | - public void onSuccess(String json) { | |
327 | - if (json != null) { | |
326 | + public void onSuccess(String urlImage) { | |
327 | + if (urlImage != null) { | |
328 | + progressDialog.dismiss(); | |
328 | 329 | Debug.warn(" Upload data success success"); |
329 | - Debug.warn("DATA JSON result: " + json.toString()); | |
330 | - uploadImageDone(json); | |
330 | + Debug.warn("DATA JSON result: " + urlImage); | |
331 | + uploadImageDone(urlImage); | |
331 | 332 | } else { |
332 | 333 | progressDialog.dismiss(); |
333 | 334 | Debug.warn(" Upload data fail: response null"); |
app/src/main/java/com/dinhcv/lifelogpedometer/activity/WelcomeActivity.java
... | ... | @@ -116,6 +116,7 @@ |
116 | 116 | if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
117 | 117 | if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) |
118 | 118 | == PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) |
119 | + == PackageManager.PERMISSION_GRANTED)&& (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) | |
119 | 120 | == PackageManager.PERMISSION_GRANTED)) { |
120 | 121 | checkRefreshToken(); |
121 | 122 | |
122 | 123 | |
123 | 124 | |
... | ... | @@ -124,16 +125,17 @@ |
124 | 125 | if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission |
125 | 126 | .ACCESS_COARSE_LOCATION) |
126 | 127 | && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest |
128 | + .permission.ACCESS_FINE_LOCATION) && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest | |
127 | 129 | .permission.ACCESS_FINE_LOCATION)) { |
128 | 130 | ActivityCompat.requestPermissions(this, |
129 | 131 | new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, |
130 | - Manifest.permission.ACCESS_FINE_LOCATION}, | |
132 | + Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}, | |
131 | 133 | PERMISSIONS_REQUEST); |
132 | 134 | |
133 | 135 | } else { |
134 | 136 | ActivityCompat.requestPermissions(this, |
135 | 137 | new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, |
136 | - Manifest.permission.ACCESS_FINE_LOCATION}, | |
138 | + Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}, | |
137 | 139 | PERMISSIONS_REQUEST); |
138 | 140 | } |
139 | 141 | } |
app/src/main/java/com/dinhcv/lifelogpedometer/portal/LLAPIManager.java
... | ... | @@ -5,9 +5,9 @@ |
5 | 5 | import android.graphics.Bitmap; |
6 | 6 | import android.graphics.BitmapFactory; |
7 | 7 | import android.os.AsyncTask; |
8 | -import android.provider.Settings; | |
9 | -import android.support.annotation.NonNull; | |
8 | +import android.os.Environment; | |
10 | 9 | import android.util.Base64; |
10 | +import android.util.Log; | |
11 | 11 | |
12 | 12 | import com.dinhcv.lifelogpedometer.interfaces.LLAPIManagerListener; |
13 | 13 | import com.dinhcv.lifelogpedometer.model.Shareprefer.Setting; |
14 | 14 | |
15 | 15 | |
... | ... | @@ -21,9 +21,16 @@ |
21 | 21 | import org.json.JSONObject; |
22 | 22 | |
23 | 23 | import java.io.ByteArrayOutputStream; |
24 | +import java.io.File; | |
25 | +import java.io.FileOutputStream; | |
24 | 26 | import java.io.IOException; |
25 | 27 | import java.io.InputStream; |
28 | +import java.io.OutputStreamWriter; | |
29 | +import java.io.UnsupportedEncodingException; | |
30 | +import java.net.URLEncoder; | |
26 | 31 | import java.util.Date; |
32 | +import java.util.HashMap; | |
33 | +import java.util.Map; | |
27 | 34 | import java.util.concurrent.TimeUnit; |
28 | 35 | |
29 | 36 | import okhttp3.HttpUrl; |
30 | 37 | |
31 | 38 | |
32 | 39 | |
33 | 40 | |
34 | 41 | |
35 | 42 | |
36 | 43 | |
37 | 44 | |
... | ... | @@ -182,55 +189,37 @@ |
182 | 189 | |
183 | 190 | @Override |
184 | 191 | protected String doInBackground(Void... voids) { |
185 | - HttpUrl baseUrl = HttpUrl.parse(URL_ROOT + URL_UPLOAD_IMAGE_INFO); | |
186 | - JSONObject jsonObject = new JSONObject(); | |
187 | - byte[] bitmapByte = convertBitmapToByteArray(bitmap); | |
192 | + String baseUrl = URL_ROOT + URL_UPLOAD_IMAGE_INFO; | |
193 | + | |
194 | + Bitmap b = Bitmap.createScaledBitmap(bitmap, 120, 120, false); | |
195 | + byte[] bitmapByte = convertBitmapToByteArray(b); | |
188 | 196 | String imageBase64 = Base64.encodeToString(bitmapByte, Base64.DEFAULT); |
189 | - String imageStr = imageBase64.replace("\n",""); | |
190 | 197 | |
191 | 198 | String token = APIResponse.getInstance().getToken(); |
192 | - try { | |
193 | - if (token != null && !token.isEmpty()) { | |
194 | - Debug.normal("Token is not null"); | |
195 | - jsonObject.put("token", token); | |
196 | - } | |
197 | - jsonObject.put("img", imageStr); | |
198 | - | |
199 | - Debug.warn("Json data: " + jsonObject.toString()); | |
200 | - } catch (JSONException e) { | |
201 | - Debug.normal("Error ", e.getMessage()); | |
199 | + //generate hashMap to store encodedImage and the name | |
200 | + HashMap<String,String> detail = new HashMap<>(); | |
201 | + detail.put("img", imageBase64); | |
202 | + if (token != null && !token.isEmpty()) { | |
203 | + Debug.normal("Token is not null"); | |
204 | + detail.put("token", token); | |
202 | 205 | } |
203 | 206 | |
204 | - MediaType JSON | |
205 | - = MediaType.parse("application/json; charset=utf-8"); | |
206 | - RequestBody requestBody = RequestBody.create(JSON, jsonObject.toString()); | |
207 | - | |
208 | - final Request.Builder request = new Request.Builder() | |
209 | - .url(baseUrl) | |
210 | - .header("User-Agent", Utils.getCustomUA()) | |
211 | - .header("Content-Type", "application/json") | |
212 | - .post(requestBody); | |
213 | - | |
214 | - OkHttpClient httpClient = new OkHttpClient.Builder() | |
215 | - .readTimeout(30, TimeUnit.SECONDS) | |
216 | - .writeTimeout(30, TimeUnit.SECONDS) | |
217 | - .connectTimeout(30, TimeUnit.SECONDS) | |
218 | - .build(); | |
219 | - String jsonString = null; | |
220 | 207 | try { |
221 | - Response response = httpClient.newCall(request.build()).execute(); | |
208 | + String dataToSend = hashMapToUrl(detail); | |
209 | + | |
210 | + String response = RequestPostImage.post(baseUrl,dataToSend); | |
222 | 211 | if (response == null) { |
223 | 212 | action.onError(null); |
224 | 213 | Debug.error("Response is null"); |
225 | 214 | return null; |
226 | 215 | } |
227 | - jsonString = getResponseData(response.body()); | |
228 | 216 | |
217 | + Debug.normal("Response: "+response); | |
218 | + return response; | |
229 | 219 | } catch (IOException e) { |
230 | 220 | Debug.normal("Error %s", e.getMessage()); |
221 | + return null; | |
231 | 222 | } |
232 | - | |
233 | - return jsonString; | |
234 | 223 | } |
235 | 224 | |
236 | 225 | @Override |
... | ... | @@ -250,9 +239,9 @@ |
250 | 239 | |
251 | 240 | try { |
252 | 241 | JSONObject jsonObject = new JSONObject(jsonString); |
253 | - int status = jsonObject.optInt("status"); | |
254 | - if (status == 1){ | |
255 | - action.onSuccess(new JSONObject()); | |
242 | + int status = jsonObject.optInt("httpCode"); | |
243 | + if (status != 0){ | |
244 | + action.onSuccess(jsonObject.optString("message")); | |
256 | 245 | }else { |
257 | 246 | action.onError(new Error(jsonObject.optString("message"))); |
258 | 247 | } |
... | ... | @@ -262,6 +251,104 @@ |
262 | 251 | } |
263 | 252 | } |
264 | 253 | |
254 | + public static class UploadImage1 extends AsyncTask<Void, Void, String>{ | |
255 | + private Bitmap bitmap; | |
256 | + private LLAPIManagerListener action; | |
257 | + | |
258 | + public UploadImage1(Bitmap bitmap, LLAPIManagerListener action) { | |
259 | + this.bitmap = bitmap; | |
260 | + this.action = action; | |
261 | + } | |
262 | + | |
263 | + @Override | |
264 | + protected void onPreExecute() { | |
265 | + super.onPreExecute(); | |
266 | + } | |
267 | + | |
268 | + @Override | |
269 | + protected String doInBackground(Void... voids) { | |
270 | + HttpUrl baseUrl = HttpUrl.parse(URL_ROOT + URL_UPLOAD_IMAGE_INFO); | |
271 | + JSONObject jsonObject = new JSONObject(); | |
272 | + Bitmap b = Bitmap.createScaledBitmap(bitmap, 120, 120, false); | |
273 | + byte[] bitmapByte = convertBitmapToByteArray(b); | |
274 | + String imageBase64 = Base64.encodeToString(bitmapByte, Base64.DEFAULT); | |
275 | + //String imageStr = imageBase64.replace("\n",""); | |
276 | + //writeToFile(imageBase64); | |
277 | + | |
278 | + String token = APIResponse.getInstance().getToken(); | |
279 | + try { | |
280 | + if (token != null && !token.isEmpty()) { | |
281 | + Debug.normal("Token is not null"); | |
282 | + jsonObject.put("token", token); | |
283 | + } | |
284 | + jsonObject.put("img", imageBase64); | |
285 | + | |
286 | + //Debug.warn("Json data: " + jsonObject.toString()); | |
287 | + } catch (JSONException e) { | |
288 | + Debug.normal("Error ", e.getMessage()); | |
289 | + } | |
290 | + | |
291 | + MediaType JSON | |
292 | + = MediaType.parse("application/json; charset=utf-8"); | |
293 | + RequestBody requestBody = RequestBody.create(JSON, jsonObject.toString()); | |
294 | + | |
295 | + final Request.Builder request = new Request.Builder() | |
296 | + .url(baseUrl) | |
297 | + .header("Content-Type", "application/json") | |
298 | + .post(requestBody); | |
299 | + | |
300 | + OkHttpClient httpClient = new OkHttpClient.Builder() | |
301 | + .readTimeout(30, TimeUnit.SECONDS) | |
302 | + .writeTimeout(30, TimeUnit.SECONDS) | |
303 | + .connectTimeout(30, TimeUnit.SECONDS) | |
304 | + .build(); | |
305 | + String jsonString = null; | |
306 | + try { | |
307 | + Response response = httpClient.newCall(request.build()).execute(); | |
308 | + if (response == null) { | |
309 | + action.onError(null); | |
310 | + Debug.error("Response is null"); | |
311 | + return null; | |
312 | + } | |
313 | + jsonString = getResponseData(response.body()); | |
314 | + | |
315 | + } catch (IOException e) { | |
316 | + Debug.normal("Error %s", e.getMessage()); | |
317 | + } | |
318 | + | |
319 | + return jsonString; | |
320 | + } | |
321 | + | |
322 | + @Override | |
323 | + protected void onCancelled() { | |
324 | + super.onCancelled(); | |
325 | + action.onError(null); | |
326 | + } | |
327 | + | |
328 | + @Override | |
329 | + protected void onPostExecute(String jsonString) { | |
330 | + super.onPostExecute(jsonString); | |
331 | + if ((jsonString == null) || (jsonString.isEmpty())) { | |
332 | + action.onError(null); | |
333 | + return; | |
334 | + } | |
335 | + Debug.normal("String body: "+jsonString); | |
336 | + | |
337 | + try { | |
338 | + JSONObject jsonObject = new JSONObject(jsonString); | |
339 | + int status = jsonObject.optInt("status"); | |
340 | + if (status == 1){ | |
341 | + action.onSuccess(new JSONObject()); | |
342 | + }else { | |
343 | + action.onError(new Error(jsonObject.optString("message"))); | |
344 | + } | |
345 | + } catch (JSONException e) { | |
346 | + e.printStackTrace(); | |
347 | + } | |
348 | + } | |
349 | + } | |
350 | + | |
351 | + | |
265 | 352 | public static class Register extends AsyncTask<Void, Void, String>{ |
266 | 353 | private RegisterInfo registerInfo; |
267 | 354 | private LLAPIManagerListener action; |
268 | 355 | |
269 | 356 | |
270 | 357 | |
271 | 358 | |
... | ... | @@ -285,23 +372,24 @@ |
285 | 372 | try { |
286 | 373 | jsonObject.put("username", registerInfo.getUsername()); |
287 | 374 | jsonObject.put("password", registerInfo.getPassword()); |
375 | + jsonObject.put("password_confirmation", registerInfo.getPassword()); | |
288 | 376 | jsonObject.put("full_name", registerInfo.getFullName()); |
289 | - jsonObject.put("nickname", registerInfo.getNickname()); | |
377 | + //jsonObject.put("nickname", registerInfo.getNickname()); | |
290 | 378 | jsonObject.put("birthday", Utils.dateToStringFormatDayMonthYear(registerInfo.getBirthday())); |
291 | 379 | jsonObject.put("height", ""+registerInfo.getHeight()); |
292 | 380 | jsonObject.put("weight", ""+registerInfo.getWeight()); |
293 | 381 | jsonObject.put("fat_rate", ""+registerInfo.getFatRate()); |
294 | 382 | jsonObject.put("gender", ""+registerInfo.getGender()); |
295 | - jsonObject.put("address", registerInfo.getAddress()); | |
296 | - jsonObject.put("desciption", ""); | |
383 | + //jsonObject.put("address", registerInfo.getAddress()); | |
384 | + //jsonObject.put("desciption", ""); | |
297 | 385 | jsonObject.put("receive_notification", "0"); |
298 | 386 | //jsonObject.put("phone", "+84986940999"); |
299 | 387 | jsonObject.put("share_data", "1"); |
300 | 388 | jsonObject.put("profile_image", ""+registerInfo.getProfileImage()); |
301 | - jsonObject.put("delete_flag", "0"); | |
389 | + //jsonObject.put("delete_flag", "0"); | |
302 | 390 | jsonObject.put("email", registerInfo.getEmail()); |
303 | 391 | jsonObject.put("physical_activity", "0"); |
304 | - jsonObject.put("remember_me", "1"); | |
392 | + //jsonObject.put("remember", "1"); | |
305 | 393 | |
306 | 394 | Debug.warn("Json data: " + jsonObject.toString()); |
307 | 395 | } catch (JSONException e) { |
... | ... | @@ -1190,5 +1278,52 @@ |
1190 | 1278 | return unzipString; |
1191 | 1279 | } |
1192 | 1280 | |
1281 | + | |
1282 | + public static void writeToFile(String data) | |
1283 | + { | |
1284 | + String path = | |
1285 | + Environment.getExternalStorageDirectory() + File.separator + "yourFolder"; | |
1286 | + // Create the folder. | |
1287 | + File folder = new File(path); | |
1288 | + folder.mkdirs(); | |
1289 | + | |
1290 | + // Create the file. | |
1291 | + File file = new File(folder, "config.txt"); | |
1292 | + // Save your stream, don't forget to flush() it before closing it. | |
1293 | + | |
1294 | + try | |
1295 | + { | |
1296 | + file.createNewFile(); | |
1297 | + FileOutputStream fOut = new FileOutputStream(file); | |
1298 | + OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); | |
1299 | + myOutWriter.append(data); | |
1300 | + | |
1301 | + myOutWriter.close(); | |
1302 | + | |
1303 | + fOut.flush(); | |
1304 | + fOut.close(); | |
1305 | + } | |
1306 | + catch (IOException e) | |
1307 | + { | |
1308 | + Log.e("Exception", "File write failed: " + e.toString()); | |
1309 | + } | |
1310 | + } | |
1311 | + | |
1312 | + private static String hashMapToUrl(HashMap<String, String> params) throws UnsupportedEncodingException { | |
1313 | + StringBuilder result = new StringBuilder(); | |
1314 | + boolean first = true; | |
1315 | + for(Map.Entry<String, String> entry : params.entrySet()){ | |
1316 | + if (first) | |
1317 | + first = false; | |
1318 | + else | |
1319 | + result.append("&"); | |
1320 | + | |
1321 | + result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); | |
1322 | + result.append("="); | |
1323 | + result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); | |
1324 | + } | |
1325 | + | |
1326 | + return result.toString(); | |
1327 | + } | |
1193 | 1328 | } |
app/src/main/java/com/dinhcv/lifelogpedometer/portal/RequestPostImage.java
1 | +package com.dinhcv.lifelogpedometer.portal; | |
2 | + | |
3 | +/** | |
4 | + * Created by Administrator on 25/12/2017. | |
5 | + */ | |
6 | +import android.util.Log; | |
7 | + | |
8 | +import java.io.BufferedReader; | |
9 | +import java.io.BufferedWriter; | |
10 | +import java.io.IOException; | |
11 | +import java.io.InputStreamReader; | |
12 | +import java.io.OutputStream; | |
13 | +import java.io.OutputStreamWriter; | |
14 | +import java.net.HttpURLConnection; | |
15 | +import java.net.URL; | |
16 | + | |
17 | +/** | |
18 | + * class to make Http RequestPostImage to the web | |
19 | + */ | |
20 | +public class RequestPostImage { | |
21 | + | |
22 | + private static final String TAG = RequestPostImage.class.getSimpleName(); | |
23 | + | |
24 | + public static String post(String serverUrl,String dataToSend){ | |
25 | + try { | |
26 | + URL url = new URL(serverUrl); | |
27 | + HttpURLConnection con = (HttpURLConnection) url.openConnection(); | |
28 | + //set timeout of 30 seconds | |
29 | + con.setConnectTimeout(1000 * 30); | |
30 | + con.setReadTimeout(1000 * 30); | |
31 | + //method | |
32 | + con.setRequestMethod("POST"); | |
33 | + con.setDoOutput(true); | |
34 | + | |
35 | + OutputStream os = con.getOutputStream(); | |
36 | + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os,"UTF-8")); | |
37 | + | |
38 | + //make request | |
39 | + writer.write(dataToSend); | |
40 | + writer.flush(); | |
41 | + writer.close(); | |
42 | + os.close(); | |
43 | + | |
44 | + //get the response | |
45 | + int responseCode = con.getResponseCode(); | |
46 | + | |
47 | + if(responseCode == HttpURLConnection.HTTP_OK){ | |
48 | + //read the response | |
49 | + StringBuilder sb = new StringBuilder(); | |
50 | + | |
51 | + BufferedReader reader = new BufferedReader( | |
52 | + new InputStreamReader(con.getInputStream())); | |
53 | + String line; | |
54 | + | |
55 | + //loop through the response from the server | |
56 | + while ((line = reader.readLine()) != null){ | |
57 | + sb.append(line).append("\n"); | |
58 | + } | |
59 | + | |
60 | + //return the response | |
61 | + return sb.toString(); | |
62 | + }else{ | |
63 | + Log.e(TAG,"ERROR - Invalid response code from server "+ responseCode); | |
64 | + return null; | |
65 | + } | |
66 | + | |
67 | + } catch (IOException e) { | |
68 | + e.printStackTrace(); | |
69 | + Log.e(TAG,"ERROR "+e); | |
70 | + return null; | |
71 | + } | |
72 | + } | |
73 | +} |
app/src/main/res/drawable/add_ic.PNG
app/src/main/res/layout/activity_register.xml
... | ... | @@ -4,6 +4,7 @@ |
4 | 4 | android:layout_height="match_parent" |
5 | 5 | android:gravity="center_horizontal" |
6 | 6 | android:orientation="vertical" |
7 | + android:background="@drawable/bg" | |
7 | 8 | tools:context="com.dinhcv.lifelogpedometer.activity.LoginActivity"> |
8 | 9 | |
9 | 10 | <include layout="@layout/layout_toolbar" /> |
... | ... | @@ -19,7 +20,6 @@ |
19 | 20 | android:id="@+id/email_login_form" |
20 | 21 | android:layout_width="match_parent" |
21 | 22 | android:layout_height="wrap_content" |
22 | - android:background="@color/background_main" | |
23 | 23 | android:orientation="vertical" |
24 | 24 | android:paddingTop="30dp"> |
25 | 25 | |
... | ... | @@ -36,7 +36,7 @@ |
36 | 36 | android:layout_height="@dimen/add_img_height" |
37 | 37 | android:src="@drawable/add_ic" |
38 | 38 | app:civ_border_width="2dp" |
39 | - app:civ_border_color="#FF000000"/> | |
39 | + app:civ_border_color="#FFFFFF"/> | |
40 | 40 | |
41 | 41 | <LinearLayout |
42 | 42 | android:layout_width="match_parent" |