Przeglądaj źródła

1.修改Android Apex Drivers上传。

Pen Li 7 lat temu
rodzic
commit
821b1f5ad7

+ 12 - 7
ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/Upload/RAUploadManager.java

@@ -76,12 +76,12 @@ public class RAUploadManager {
         //TaskStatusCancel,
     }
 
-    public RAUploadManager(Context applicationContext)
-    {
-        if(applicationContext==null)
-            throw new IllegalArgumentException("applicationContext can't be null");
-        this.applicationContext = applicationContext;
-    }
+//    public RAUploadManager(Context applicationContext)
+//    {
+//        if(applicationContext==null)
+//            throw new IllegalArgumentException("applicationContext can't be null");
+//        this.applicationContext = applicationContext;
+//    }
     public UIUpdateListener uiUpdateListener;
 
 //    private Application mApp;
@@ -113,7 +113,12 @@ public class RAUploadManager {
 //        }
 //    }
 
-    public RAUploadManager() {
+    public RAUploadManager(Context appCtx) {
+
+        if(appCtx==null)
+            throw new IllegalArgumentException("applicationContext can't be null");
+        this.applicationContext = appCtx;
+
         queue_status = QueueStatus.QueueStatusDefault;
 
 

+ 7 - 0
ApexDrivers/app/src/main/AndroidManifest.xml

@@ -93,6 +93,13 @@
 
         </activity>
 
+        <activity
+            android:name=".Upload.UploadListActivity"
+            android:screenOrientation="portrait"
+                  >
+
+        </activity>
+
     </application>
 
 </manifest>

+ 5 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/ApexDriversBackgroundService.java

@@ -5,12 +5,17 @@ import android.location.Location;
 import android.util.Log;
 
 import com.usai.redant.rautils.Service.RAService;
+import com.usai.redant.rautils.Upload.RAUploadManager;
 import com.usai.redant.rautils.Utils.dbgUtil;
 
 import org.json.JSONObject;
 
 public class ApexDriversBackgroundService extends RAService implements RAService.ServiceLocation, RAService.ServicePushNotification,RAService.ServiceUpload{
+
+    public RAUploadManager uploadManager = new RAUploadManager(ApexDriverApplication.sharedApplication().getApplicationContext());
+
     public ApexDriversBackgroundService() {
+
     }
 
     @Override

+ 3 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/MainActivity.java

@@ -21,6 +21,7 @@ import android.widget.RelativeLayout;
 import com.usai.redant.apexdrivers.Home.HomeFragment;
 import com.usai.redant.apexdrivers.Login.LoginFragment;
 import com.usai.redant.apexdrivers.Network.Network;
+import com.usai.redant.apexdrivers.Upload.UploadListActivity;
 import com.usai.redant.rautils.Utils.RAUtil;
 import com.usai.redant.rautils.Utils.dbgUtil;
 
@@ -158,6 +159,8 @@ public class MainActivity extends AppCompatActivity implements LoginFragment.Log
         switch (item.getItemId()) {
             case 0: {
 
+                Intent intent = new Intent(this, UploadListActivity.class);
+                startActivity(intent);
             }
             break;
             case 1: {

+ 44 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Update/UpdateActivity.java

@@ -34,6 +34,8 @@ import com.usai.redant.apexdrivers.Update.Model.UpdateBaseModel;
 import com.usai.redant.apexdrivers.Update.Model.UpdateInputModel;
 import com.usai.redant.apexdrivers.Update.Model.UpdateMultInputModel;
 import com.usai.redant.apexdrivers.Update.Model.UpdatePhotoModel;
+import com.usai.redant.rautils.Receiver.RABroadcast;
+import com.usai.redant.rautils.Utils.FileManager;
 import com.usai.redant.rautils.Utils.ImageUtil;
 import com.usai.redant.rautils.Utils.Network;
 import com.usai.redant.rautils.Utils.RAUtil;
@@ -517,6 +519,48 @@ public class UpdateActivity extends AppCompatActivity implements UpdateAdapter.U
 
     private void backgroundUpload(ArrayList<UpdatePhotoModel> photos, final JSONObject json) {
 
+        if (photos == null || (photos != null && photos.size() == 0) || json == null) {
+            return;
+        }
+
+        ArrayList<Bundle> taskArr = new ArrayList<Bundle>();
+        final ArrayList<UpdatePhotoModel> photoArr = photos;
+
+        String encryptUser = ApexDriverApplication.sharedApplication().encryptUser();
+        String encryptPwd = ApexDriverApplication.sharedApplication().encryptPassword();
+
+        for (int i = 0; i < photoArr.size(); i++) {
+
+            UpdatePhotoModel model = photoArr.get(i);
+            String serial = json.optString(model.key);
+            if (serial != null && serial.length() > 0) {
+
+                Bundle task = new Bundle();
+                task.putString("path",model.photoPath);
+                task.putString("file", FileManager.lastPathComponent(model.photoPath));
+                task.putString("url","");
+                task.putString("order",mOrderID);
+                task.putString("action",getTitle().toString());
+
+                Bundle params = new Bundle();
+                params.putString("user",encryptUser);
+                params.putString("password",encryptPwd);
+                params.putString("platform","android");
+                params.putString("serial", serial);
+
+                task.putBundle("params",params);
+                taskArr.add(task);
+            }
+        }
+
+        if (taskArr.size() > 0) {
+
+            Intent intent = new Intent(RABroadcast.ACTION_UPLOAD_ADD_TASK);
+            intent.putParcelableArrayListExtra("tasks",taskArr);
+
+            sendBroadcast(intent);
+        }
+
     }
 
     private ArrayList<UpdatePhotoModel> prepareParams(Bundle params) {

+ 420 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Upload/UploadListActivity.java

@@ -0,0 +1,420 @@
+package com.usai.redant.apexdrivers.Upload;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageButton;
+import android.widget.ListView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.usai.redant.apexdrivers.ApexDriversBackgroundService;
+import com.usai.redant.apexdrivers.R;
+import com.usai.redant.rautils.Upload.RAUploadManager;
+
+
+import java.util.ArrayList;
+
+
+public class UploadListActivity extends AppCompatActivity {
+
+
+    private ArrayList<Bundle> displaylist = new ArrayList<Bundle>();
+
+    //    private SwipeMenuListView uploadList;
+    private ListView uploadList;
+    private uploadAdapter adapter;
+//    private ArrayList<Bundle> arr;
+
+    private RAUploadManager uploadManager;
+    private ApexDriversBackgroundService.MyBinder binder;
+    private ApexDriversBackgroundService uploadServiceservice;
+    private boolean serviceConnectionFlag = false; // 绑定服务标识
+    private ServiceConnection serviceConnection;
+    private RAUploadManager.UIUpdateListener uiUpdateListener = new RAUploadManager.UIUpdateListener() {
+
+        @Override
+        public void updateCell(long index, final Bundle taskinfo)
+        {
+            if(true)
+                return;
+
+            if(true) {
+
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+
+                        adapter.notifyDataSetChanged();
+                    }
+                });
+
+                return;
+            }
+
+            final int position = (int)index;
+
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+
+                    double percent = taskinfo.getDouble("progress",0);
+
+                    long timeStart = System.currentTimeMillis();
+
+                    int startShowIndex = uploadList.getFirstVisiblePosition();
+                    int lastShowIndex = uploadList.getLastVisiblePosition();
+
+                    if (position >= startShowIndex && position <= lastShowIndex) {
+                        View cell = uploadList.getChildAt((int)position - startShowIndex);
+                        uploadAdapter.ViewHolder holder= (uploadAdapter.ViewHolder)cell.getTag();
+
+
+
+                        RAUploadManager.TaskStatus istatus = RAUploadManager.TaskStatus.values()[taskinfo.getInt("status",0)];
+                        String status="";
+                        switch(istatus)
+                        {
+                            case TaskStatusStart:
+                                status="uploading";
+                                break;
+                            case TaskStatusStop:
+                                status="stop";
+                                break;
+                            case TaskStatusError:
+                                status="warning";
+                                break;
+                            case TaskStatusWait:
+                                status="waiting";
+                                break;
+                            case TaskStatusFinish:
+                                status="finish";
+                                break;
+
+                            default:
+                                status="warning";
+                                break;
+                        }
+
+
+
+                        String err = taskinfo.getString("msg");
+                        String name = taskinfo.getString("order","");
+                        String action = taskinfo.getString("action","");
+                        String time = taskinfo.getString("time");
+
+                        holder.name_tv.setText(name);
+                        holder.progressBar.setProgress((int)(100 *percent));
+                        holder.state_tv.setText(status);
+                        holder.action_tv.setText(action);
+                        holder.time_tv.setText(time);
+                        holder.progress_tv.setText(String.format("%.2f%%",100*percent));
+                        holder.err_tv.setText(err);
+                    }
+
+                }
+            });
+        }
+
+        @Override
+        public void updateList(final ArrayList<Bundle> newlist)
+        {
+
+
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+
+                    Log.d("_LIST","running  tid="+Thread.currentThread().getId());
+                    Log.d("_LIST", "uploadlist UI  size:  "+ newlist.size());
+                    long timeStart = System.currentTimeMillis();
+                    displaylist = (ArrayList<Bundle>) newlist.clone();
+                    adapter.notifyDataSetChanged();
+
+                }
+            });
+
+        }
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_upload_list);
+
+        ActionBar mActionBar = getSupportActionBar();
+        mActionBar.setHomeButtonEnabled(true);
+        mActionBar.setDisplayHomeAsUpEnabled(true);
+        mActionBar.setTitle("Apex Drivers");
+
+
+        // 初始化视图
+        uploadList = (ListView)findViewById(R.id.upload_list);
+        adapter = new uploadAdapter(R.layout.upload_cell);
+        uploadList.setAdapter(adapter);
+        serviceConnection = new ServiceConnection() {
+            @Override
+            public void onServiceConnected(ComponentName name, IBinder iBinder) {
+                serviceConnectionFlag = true;
+
+                binder = (ApexDriversBackgroundService.MyBinder)iBinder;
+                uploadServiceservice = (ApexDriversBackgroundService)binder.getService();
+
+
+
+
+                uploadManager = uploadServiceservice.uploadManager;
+                uploadManager.uiUpdateListener = uiUpdateListener;
+                displaylist = (ArrayList<Bundle>) uploadManager.get_arr_queue().clone(); //uploadManager.arr_queue;
+
+            }
+
+            @Override
+            public void onServiceDisconnected(ComponentName name) {
+                serviceConnectionFlag = false;
+                uploadManager.uiUpdateListener = null;
+            }
+        };
+
+        bindService();
+
+    }
+
+    @Override
+    protected void onDestroy() {
+
+        unbindService(serviceConnection);
+
+        super.onDestroy();
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.upload_list_menu,menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case android.R.id.home: {
+                finish();
+            }
+            break;
+            case R.id.clear_upload_list_btn: {
+
+                clearUploadList();
+            }
+            break;
+        }
+        return true;
+    }
+
+    private void clearUploadList() {
+        if (displaylist.size() == 0) {
+            new AlertDialog.Builder(this)
+                    .setTitle("Warning")
+                    .setMessage("Upload list is empty.")
+                    .setPositiveButton("OK",null)
+                    .show();
+            return;
+        }
+
+        new AlertDialog.Builder(this)
+                .setTitle("Clear upload list")
+                .setMessage("Are you sure remove all error/finish task?")
+                .setPositiveButton("YES", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        // clear
+                        if (serviceConnectionFlag == true && uploadServiceservice != null) {
+                            uploadManager.clearTask();
+//                            adapter.notifyDataSetChanged();
+                        }
+
+                    }
+                })
+                .setNegativeButton("NO", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+
+                    }
+                })
+                .show();
+
+    }
+
+
+    private class uploadAdapter extends BaseAdapter {
+        private int resourceId;
+        public uploadAdapter(int resourceID) {
+
+            resourceId = resourceID;
+        }
+
+        @Override
+        public int getCount() {
+            return displaylist.size();
+        }
+
+        @Override
+        public Bundle getItem(int position) {
+            return displaylist.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+//        @Override
+//        public int getViewTypeCount() {
+//            return 4;
+//        }
+//
+//        @Override
+//        public int getItemViewType(int position) {
+//            /**
+//             * 0. <finish>      remove              </finish>
+//             * 1. <error>       start  remove       </error>
+//             * 2. <stop>        start               </stop>
+//             * 3. <start\wait>  none                </start\wait>
+//             * */
+//            return taskSwipeType(position);
+//        }
+
+        @NonNull
+        @Override
+        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
+
+            Log.d("_LIST","running  tid="+Thread.currentThread().getId());
+            long timeStart = System.currentTimeMillis();
+
+            final Bundle item = displaylist.get(position);
+
+            RAUploadManager.TaskStatus istatus = RAUploadManager.TaskStatus.values()[item.getInt("status",0)];
+            String status="";
+            switch(istatus)
+            {
+                case TaskStatusStart:
+                    status="uploading";
+                    break;
+                case TaskStatusStop:
+                    status="stop";
+                    break;
+                case TaskStatusError:
+                    status="warning";
+                    break;
+                case TaskStatusWait:
+                    status="waiting";
+                    break;
+                case TaskStatusFinish:
+                    status="finish";
+                    break;
+
+                default:
+                    status="warning";
+                    break;
+            }
+
+            double percent = item.getDouble("progress",0);
+            String err = item.getString("msg");
+            String name = item.getString("order","");
+            String action = item.getString("action","");
+            String time = item.getString("time");
+
+            View cell;
+            ViewHolder holder;
+            if (convertView != null) {
+
+                cell = convertView;
+                holder = (ViewHolder)cell.getTag();
+
+            } else  {
+
+                cell = View.inflate(getApplicationContext(),resourceId,null);
+                holder = new ViewHolder();
+                holder.name_tv = (TextView)cell.findViewById(R.id.upload_cell_title_tv);
+                holder.action_tv = cell.findViewById(R.id.upload_cell_action_tv);
+                holder.time_tv = cell.findViewById(R.id.upload_cell_time_tv);
+                holder.progressBar = (ProgressBar)cell.findViewById(R.id.upload_progressBar);
+                holder.state_tv = (TextView)cell.findViewById(R.id.upload_state_tv);
+                holder.progress_tv = (TextView)cell.findViewById(R.id.upload_progress_tv);
+                holder.err_tv = (TextView)cell.findViewById(R.id.upload_err_tv);
+                holder.btn_reload=(ImageButton) cell.findViewById(R.id.btn_reload);
+
+
+                holder.btn_reload.setImageResource(R.drawable.ic_action_reload);
+                if(istatus!= RAUploadManager.TaskStatus.TaskStatusError)
+                {
+                    holder.btn_reload.setVisibility(View.GONE);
+                }
+                else
+                {
+                    holder.btn_reload.setVisibility(View.VISIBLE);
+                    holder.btn_reload.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+
+                            uploadManager.startTask(item);
+
+                        }
+                    });
+                }
+                cell.setTag(holder);
+            }
+
+            holder.name_tv.setText(name);
+            holder.action_tv.setText(action);
+            holder.time_tv.setText(time);
+            holder.progressBar.setProgress((int) (100 * percent));
+            holder.state_tv.setText(status);
+            holder.progress_tv.setText(String.format("%.2f%%",100*percent));
+            holder.err_tv.setText(err);
+
+
+
+            Log.d("_LIST", "getView(): POSITION   "+position+" COST   " + (System.currentTimeMillis() - timeStart));
+            return cell;
+        }
+
+        private class ViewHolder {
+            public TextView name_tv;
+            public TextView action_tv;
+            public TextView time_tv;
+            public ProgressBar progressBar;
+            public TextView state_tv;
+            public TextView progress_tv;
+            public TextView err_tv;
+            public ImageButton btn_reload;
+        }
+    }
+
+
+    /** Service */
+    private void bindService() {
+        Intent intent = new Intent(UploadListActivity.this, ApexDriversBackgroundService.class);
+
+        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
+    }
+
+    private int dp2px(int dp) {
+        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,getResources().getDisplayMetrics());
+    }
+}

BIN
ApexDrivers/app/src/main/res/drawable-hdpi/ic_action_reload.png


BIN
ApexDrivers/app/src/main/res/drawable-mdpi/ic_action_reload.png


BIN
ApexDrivers/app/src/main/res/drawable-xhdpi/ic_action_reload.png


BIN
ApexDrivers/app/src/main/res/drawable-xxhdpi/ic_action_reload.png


+ 18 - 0
ApexDrivers/app/src/main/res/layout/activity_upload_list.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.usai.redant.apexdrivers.Upload.UploadListActivity">
+
+    <ListView
+        android:id="@+id/upload_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        >
+
+    </ListView>
+
+
+
+</RelativeLayout>

+ 136 - 0
ApexDrivers/app/src/main/res/layout/upload_cell.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/upload_cell_title_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="5dp"
+        android:textSize="17sp"
+        android:textColor="#000000"
+        android:text="AFS20180530001200"
+        />
+
+    <RelativeLayout
+        android:id="@+id/upload_cell_line"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/upload_cell_title_tv"
+        android:layout_alignLeft="@id/upload_cell_title_tv"
+        android:layout_alignRight="@id/upload_cell_title_tv"
+        >
+
+        <TextView
+            android:id="@+id/upload_cell_time_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentRight="true"
+            android:textSize="17sp"
+            android:textColor="#000000"
+            android:text="12/31/2018 24:05"
+            />
+
+        <TextView
+            android:id="@+id/upload_cell_action_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_toLeftOf="@id/upload_cell_time_tv"
+            android:layout_alignParentLeft="true"
+            android:layout_marginRight="5dp"
+            android:textSize="17sp"
+            android:textColor="#000000"
+            android:text="Delivered"
+            />
+
+    </RelativeLayout>
+
+    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                                                 xmlns:app="http://schemas.android.com/apk/res-auto"
+                                                 xmlns:tools="http://schemas.android.com/tools"
+                                                 android:id="@+id/upload_percent_tv"
+                                                 android:layout_width="match_parent"
+                                                 android:layout_height="wrap_content"
+                                                 android:layout_below="@id/upload_cell_line"
+                                                 android:minHeight="?android:attr/listPreferredItemHeight">
+
+        <android.support.constraint.ConstraintLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toLeftOf="@+id/btn_reload"
+            app:layout_constraintHorizontal_bias="0.0"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_marginTop="8dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_marginBottom="8dp"
+            android:id="@+id/constraintLayout"
+            app:layout_constraintVertical_bias="0.0">
+
+            <TextView
+                android:id="@+id/upload_err_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Error:"
+                app:layout_constraintLeft_toLeftOf="@+id/upload_progressBar"
+                app:layout_constraintTop_toBottomOf="@+id/upload_state_tv"
+                tools:layout_constraintLeft_creator="1"
+                tools:layout_constraintTop_creator="1" />
+
+            <ProgressBar
+                android:id="@+id/upload_progressBar"
+                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
+                android:layout_width="0dp"
+                android:layout_height="16dp"
+                android:layout_marginRight="0dp"
+                android:layout_marginTop="0dp"
+                android:max="100"
+                android:progress="0"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toRightOf="parent"
+                app:layout_constraintHorizontal_bias="0.0" />
+
+            <TextView
+                android:id="@+id/upload_progress_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="0dp"
+                android:layout_marginTop="5dp"
+                android:text="progress"
+                app:layout_constraintRight_toRightOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/upload_progressBar"
+                tools:layout_constraintRight_creator="1" />
+
+            <TextView
+                android:id="@+id/upload_state_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="5dp"
+                android:text="finished"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/upload_progressBar" />
+        </android.support.constraint.ConstraintLayout>
+
+        <ImageButton
+            android:id="@+id/btn_reload"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="8dp"
+            android:layout_marginEnd="7dp"
+            android:layout_marginRight="5dp"
+            android:layout_marginTop="8dp"
+            android:tint="@color/blue"
+            android:visibility="visible"
+            app:layout_constraintBottom_toBottomOf="@+id/constraintLayout"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/constraintLayout"
+            app:srcCompat="@drawable/ic_action_reload"
+            tools:layout_constraintRight_creator="1"
+            tools:layout_constraintTop_creator="1" />
+
+    </android.support.constraint.ConstraintLayout>
+
+</RelativeLayout>

+ 11 - 0
ApexDrivers/app/src/main/res/menu/upload_list_menu.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/clear_upload_list_btn"
+        app:showAsAction="always"
+        android:title="Clear"
+        />
+
+</menu>

+ 2 - 0
ApexDrivers/app/src/main/res/values/colors.xml

@@ -18,4 +18,6 @@
     <color name="message_success">#ee00ff00</color>
     <color name="message_fail">#eeff0000</color>
 
+    <color name="blue">#2172ff</color>
+
 </resources>