Procházet zdrojové kódy

1.修改Android Apex Drivers保存与恢复。

Pen Li před 7 roky
rodič
revize
27d71d9e54

+ 7 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/MainActivity.java

@@ -527,6 +527,13 @@ public class MainActivity extends BasicActivity implements LoginFragment.LoginCa
         Fragment oldFragment = manager.findFragmentByTag(FragmentTag);
 
         if (oldFragment != null) { // 屏幕旋转会导致Fragment重叠
+
+            if (ApexDriverApplication.sharedApplication().isLogin()) {
+                setupLoginAppearance(); // 隐藏ActionBar黑色分割线
+            } else {
+                setupLogoutAppearance();
+            }
+
             return;
         }
 

+ 112 - 1
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/SaveInstanceHelper.java

@@ -1,6 +1,17 @@
 package com.usai.redant.apexdrivers;
 
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import com.usai.redant.apexdrivers.detail.DetailActivity;
+import com.usai.redant.apexdrivers.home.HomeFragment;
+import com.usai.redant.apexdrivers.home.HomeHeaderModel;
+import com.usai.redant.apexdrivers.home.HomeOrderModel;
 import com.usai.redant.apexdrivers.photoCell.PhotoItemModel;
+import com.usai.redant.apexdrivers.setting.model.OptionModel;
+import com.usai.redant.apexdrivers.setting.model.SectionModel;
 import com.usai.redant.apexdrivers.update.UpdateSectionModel;
 import com.usai.redant.apexdrivers.update.model.UpdateInputModel;
 import com.usai.redant.apexdrivers.update.model.UpdatePhotoModel;
@@ -9,6 +20,8 @@ import com.usai.redant.apexdrivers.update.model.UpdateSignatureModel;
 import java.io.File;
 import java.util.ArrayList;
 
+import static com.usai.redant.apexdrivers.home.HomeFragment.HomeReloadBroadcastAction;
+
 public class SaveInstanceHelper {
 
     private static final SaveInstanceHelper ourInstance = new SaveInstanceHelper();
@@ -20,15 +33,30 @@ public class SaveInstanceHelper {
     private SaveInstanceHelper() {
 
         updateSaveHelper = new UpdateSaveHelper();
+        settingSaveHelper = new SettingSaveHelper();
+        homeSaveHelper = new HomeSaveHelper();
     }
 
+    private class BaseSaveHelper {
+
+        public boolean saved = false;
+
+        public void clear() {
+            saved = false;
+        }
+    }
+
+    /**
+     * Update
+     * */
+
     private UpdateSaveHelper updateSaveHelper;
 
     public UpdateSaveHelper getUpdateSaveHelper() {
         return updateSaveHelper;
     }
 
-    public class UpdateSaveHelper {
+    public class UpdateSaveHelper extends BaseSaveHelper {
 
         public ArrayList<UpdateSectionModel> mSectionArray = new ArrayList<>();
         public UpdateInputModel mInputModel;
@@ -38,7 +66,10 @@ public class SaveInstanceHelper {
         public File photoFile = null;
         public ArrayList<File> mPhotoArray;
 
+        @Override
         public void clear() {
+            super.clear();
+
             mSectionArray = null;
             mInputModel = null;
             mPhotoModel = null;
@@ -49,5 +80,85 @@ public class SaveInstanceHelper {
         }
     }
 
+    /**
+     * Setting
+     * */
+
+    public class SettingSaveHelper extends BaseSaveHelper {
+
+        public ArrayList<SectionModel> mSections;
+        public OptionModel mClickedOptionModel = null;
+
+        @Override
+        public void clear() {
+            super.clear();
+
+            mSections = null;
+            mClickedOptionModel = null;
+        }
+    }
+
+    private SettingSaveHelper settingSaveHelper;
+
+    public SettingSaveHelper getSettingSaveHelper() {
+        return settingSaveHelper;
+    }
+
+    /**
+     *
+     * Home
+     * */
+
+    public class HomeSaveHelper extends BaseSaveHelper {
 
+        public HomeHeaderModel mHeaderModel = null;
+        public HomeOrderModel mSelectedModel;
+        public ArrayList<HomeFragment.HomeSectionModel> mSectionArray;
+
+        public Intent homeBroadcastIntent;
+
+        @Override
+        public void clear() {
+            super.clear();
+
+            mHeaderModel = null;
+            mSelectedModel = null;
+            mSectionArray = null;
+            homeBroadcastIntent = null;
+            saved = false;
+        }
+
+        private HomeSaveHelper() {
+
+            registBroadcastReceiver();
+        }
+
+        private HomeBroadCastReceiver mReceiver;
+
+        private void registBroadcastReceiver() {
+            IntentFilter intentFilter = new IntentFilter();
+            intentFilter.addAction(HomeReloadBroadcastAction);
+            intentFilter.addAction(DetailActivity.CheckDetailNotification);
+
+            mReceiver = new HomeBroadCastReceiver();
+            ApexDriverApplication.sharedApplication().registerReceiver(mReceiver,intentFilter);
+        }
+
+        private class HomeBroadCastReceiver extends BroadcastReceiver {
+
+            @Override
+            public void onReceive(Context context, Intent intent) {
+
+                if (saved) {
+                    homeBroadcastIntent = intent;
+                }
+            }
+        }
+    }
+
+    private HomeSaveHelper homeSaveHelper;
+
+    public HomeSaveHelper getHomeSaveHelper() {
+        return homeSaveHelper;
+    }
 }

+ 25 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/DetailActivity.java

@@ -22,6 +22,7 @@ import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
+import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.ExpandableListView;
@@ -73,6 +74,7 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
     private final static  String SaveOrderType2Key = "DetailSaveOrderType2";
     private final static  String SaveStatusNo2Key = "DetailSaveStatusNo";
     private final static  String SavedLoadKey = "DetailSaveLoad";
+    private final static  String SavedFirstVisible = "SavedFirstVisible";
 
     public final static String CheckDetailNotification = "com.usai.redant.apexdriver.CheckDetailNotification";
 
@@ -113,6 +115,7 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
     private DetailHandler mHandler;
     private TextView mEmptyView;
     private boolean mLoad = false;
+    private int mFirstVisible = 0;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -166,6 +169,19 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
         });
         mListView.setEmptyView(findViewById(R.id.detail_empty_view));
 
+        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView view, int scrollState) {
+
+            }
+
+            @Override
+            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+
+                mFirstVisible = firstVisibleItem;
+            }
+        });
+
         if (savedInstanceState != null) {
 
             String jsonStr = savedInstanceState.getString(SaveDataKey);
@@ -190,6 +206,14 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
             mStatusNo = savedInstanceState.getString(SaveStatusNo2Key);
             mLoad = savedInstanceState.getBoolean(SavedLoadKey);
 
+            final int tmpVisible = savedInstanceState.getInt(SavedFirstVisible);
+            mListView.post(new Runnable() {
+                @Override
+                public void run() {
+                    mListView.setSelection(tmpVisible);
+                }
+            });
+
         } else {
             loadData();
         }
@@ -225,6 +249,7 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
         }
 
         outState.putBoolean(SavedLoadKey,mLoad);
+        outState.putInt(SavedFirstVisible,mFirstVisible);
 
         sendLifeCircleBroadCast(0);
     }

+ 113 - 71
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeFragment.java

@@ -19,6 +19,7 @@ import android.support.v7.app.AlertDialog;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.AbsListView;
 import android.widget.BaseExpandableListAdapter;
 import android.widget.Button;
 import android.widget.ExpandableListView;
@@ -28,6 +29,7 @@ import android.widget.TextView;
 import com.usai.redant.apexdrivers.ApexDriverApplication;
 import com.usai.redant.apexdrivers.MainActivity;
 import com.usai.redant.apexdrivers.R;
+import com.usai.redant.apexdrivers.SaveInstanceHelper;
 import com.usai.redant.apexdrivers.badgeview.BadgeView;
 import com.usai.redant.apexdrivers.detail.DetailActivity;
 import com.usai.redant.apexdrivers.message.MessageActivity;
@@ -46,27 +48,28 @@ import java.util.ArrayList;
 public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderDelegate {
 
     public final static String HomeReloadBroadcastAction = "com.usai.redant.apexdriver.home_refresh";
-    private final static String HomeSaveDataKey = "HomeSaveDataKey";
 
     private final static int REQUEST_MORE_CODE = 0;
 
+    private final static  String SavedFirstVisible = "SavedFirstVisible";
+
     private Context mCtx;
     private HomeFragment self = this;
     private ExpandableListView mListView;
     private SwipeRefreshLayout mRefresh;
     private HomeListAdapter mAdapter;
-    private ArrayList<HomeSectionModel> mSectionArray = new ArrayList<>();
     private HomeHandler mHandler = new HomeHandler(this);
     private HomeBroadCastReceiver mReceiver;
-    private JSONObject mJson;
-    private HomeOrderModel mSelectedModel;
+
 
     private TextView mEmptyView;
     private RelativeLayout mEmptyContainer;
-
     private HomeHeaderView mHeaderView;
 
-    private int mMessageCount = 0;
+    private HomeHeaderModel mHeaderModel = new HomeHeaderModel();
+    private HomeOrderModel mSelectedModel;
+    private ArrayList<HomeSectionModel> mSectionArray = new ArrayList<>();
+    private int mFirstVisible = 0;
 
     @Nullable
     @Override
@@ -90,6 +93,8 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
+        mCtx = getActivity();
+
         mListView = view.findViewById(R.id.home_list_view);
 
         mAdapter = new HomeListAdapter();
@@ -139,6 +144,7 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
         // header
         mHeaderView = HomeHeaderView.headerView(mCtx);
         mHeaderView.setDelegate(this);
+        mHeaderView.init();
         mListView.addHeaderView(mHeaderView);
 
         mEmptyContainer = view.findViewById(R.id.home_empty_view);
@@ -152,45 +158,56 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
         });
 //        mListView.setEmptyView(view.findViewById(R.id.home_empty_view));
 
-    }
+        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView view, int scrollState) {
 
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mCtx = getActivity();
+            }
 
-        registBroadcastReceiver();
+            @Override
+            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+                mFirstVisible = firstVisibleItem;
+            }
+        });
 
-        if (savedInstanceState != null) {
+        {
 
-            String jsonStr = savedInstanceState.getString(HomeSaveDataKey);
-            if (jsonStr != null) {
-                try {
+            registBroadcastReceiver();
 
-                    JSONObject json = new JSONObject(jsonStr);
-                    handleJson(json);
+            if (savedInstanceState != null) {
 
-                } catch (JSONException e) {
-                    e.printStackTrace();
-                }
-            }
+                recovery();
 
-        } else {
-            loadData();
-        }
-    }
+                final int tmpVisible = savedInstanceState.getInt(SavedFirstVisible);
+                mListView.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mListView.setSelection(tmpVisible);
+                    }
+                });
 
-    @Override
-    public void onResume() {
-        super.onResume();
+            } else {
+                loadData();
+            }
+        } // initial
     }
 
     @Override
     public void onSaveInstanceState(@NonNull Bundle outState) {
         super.onSaveInstanceState(outState);
 
-        if (mJson != null) {
-            outState.putString(HomeSaveDataKey,mJson.toString());
+        outState.putInt(SavedFirstVisible,mFirstVisible);
+
+        SaveInstanceHelper.HomeSaveHelper helper = SaveInstanceHelper.getInstance().getHomeSaveHelper();
+        helper.saved = true;
+        helper.mHeaderModel = mHeaderModel;
+        helper.mSelectedModel = mSelectedModel;
+        helper.mSectionArray = mSectionArray;
+
+        if (mSectionArray != null && mSectionArray.size() > 0) {
+            for (HomeSectionModel sectionModel : mSectionArray) {
+                sectionModel.clearDelegate();
+            }
         }
     }
 
@@ -208,8 +225,6 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
                 }
             }
         }
-
-
     }
 
     @Override
@@ -220,6 +235,41 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
         dismissProgressDialog();
     }
 
+    private void recovery() {
+
+        final SaveInstanceHelper.HomeSaveHelper helper = SaveInstanceHelper.getInstance().getHomeSaveHelper();
+        if (helper.saved) {
+
+            mHeaderModel = helper.mHeaderModel;
+            mSelectedModel = helper.mSelectedModel;
+            mSectionArray = helper.mSectionArray;
+
+            changeData();
+
+            final Intent intent = helper.homeBroadcastIntent;
+            if (intent != null) {
+
+                new Handler().post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mReceiver.onReceive(ApexDriverApplication.sharedApplication(), intent);
+                    }
+                });
+            }
+
+        }
+        helper.clear();
+    }
+
+    private void updateHomeHeader() {
+
+        mHeaderView.setAvailable(mHeaderModel.driver_available);
+        mHeaderView.setNewCount(mHeaderModel.new_count);
+        mHeaderView.setProcessingCount(mHeaderModel.processing_count);
+        mHeaderView.setFinishCount(mHeaderModel.finish_count);
+        mHeaderView.setExistNewMessage(mHeaderModel.message_count > 0);
+    }
+
     private void registBroadcastReceiver() {
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(HomeReloadBroadcastAction);
@@ -284,6 +334,20 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
                 .show();
     }
 
+    private void changeData() {
+
+        /**
+         * 手动调用打开/关闭 Group,否则默认关闭
+         * */
+        for (int i = 0; i < mSectionArray.size(); i++) {
+            HomeSectionModel sectionModel = mSectionArray.get(i);
+            mListView.expandGroup(i);
+        }
+
+        mAdapter.notifyDataSetChanged();
+        updateHomeHeader();
+    }
+
     private void handleJson(JSONObject json) {
 
         if (json != null) {
@@ -291,7 +355,6 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
             try {
                 JSONArray sectionArr = json.optJSONArray("sections");
                 if (sectionArr != null) {
-                    mJson = json;
                     mSectionArray.clear();
 
                     for (int i = 0; i < sectionArr.length(); i++) {
@@ -308,6 +371,8 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
 
                         mSectionArray.add(model);
                     }
+
+                    mHeaderModel.setValuesForKeysWithJSON(json);
                 }
             } catch (JSONException e) {
                 e.printStackTrace();
@@ -316,7 +381,6 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
 
         Message msg = new Message();
         msg.what = HomeHandler.HomeActionReloadData;
-        msg.obj = json;
         mHandler.sendMessage(msg);
     }
 
@@ -514,36 +578,7 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
             switch (msg.what) {
                 case HomeActionReloadData: {
 
-//                    fragment.updateEmptyViewState(false);
-
-                    /**
-                     * 手动调用打开/关闭 Group,否则默认关闭
-                     * */
-                    for (int i = 0; i < fragment.mSectionArray.size(); i++) {
-                        HomeSectionModel sectionModel = fragment.mSectionArray.get(i);
-                        fragment.mListView.expandGroup(i);
-                    }
-
-                    fragment.mAdapter.notifyDataSetChanged();
-
-                    JSONObject json = (JSONObject) msg.obj;
-                    if (json != null) {
-                        boolean driver_available = json.optBoolean("driver_available");
-
-                        int new_count = json.optInt("new_count");
-                        int processing_count = json.optInt("processing_count");
-                        int finish_count = json.optInt("finish_count");
-                        int message_count = json.optInt("message_count");
-                        fragment.mMessageCount = message_count;
-
-                        if (fragment.mHeaderView != null) {
-                            fragment.mHeaderView.setAvailable(driver_available);
-                            fragment.mHeaderView.setNewCount(new_count);
-                            fragment.mHeaderView.setProcessingCount(processing_count);
-                            fragment.mHeaderView.setFinishCount(finish_count);
-                            fragment.mHeaderView.setExistNewMessage(message_count > 0);
-                        }
-                    }
+                    fragment.changeData();
                 }
                 break;
                 case HomeActionError: {
@@ -781,14 +816,12 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
         }
     }
 
-    private static class HomeSectionModel {
+    public static class HomeSectionModel {
 
         public interface SectionModelListener {
             void refresh();
         }
 
-
-
         int type; // OrderStatus
         ArrayList<HomeOrderModel> orders;
         String title;
@@ -802,6 +835,15 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
             mContext = context;
         }
 
+        public void clearDelegate() {
+            listener = null;
+            if (orders != null && orders.size() > 0) {
+                for (HomeOrderModel model : orders) {
+                    model.clearDelegate();
+                }
+            }
+        }
+
         public void setBackendFlagCount(int count) {
             backendFlagCount = count;
 
@@ -911,12 +953,12 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
                                 fsection.setBackendFlagCount(backendCount);
 
                                 // 刷新Message
-                                int message_count = mMessageCount;
+                                int message_count = mHeaderModel.message_count;
                                 if (message_count > 0) {
                                     message_count--;
-                                    mMessageCount = message_count;
+                                    mHeaderModel.message_count = message_count;
                                 }
-                                mHeaderView.setExistNewMessage(message_count > 0);
+                                updateHomeHeader();
 
                             }
                         });

+ 20 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeHeaderModel.java

@@ -0,0 +1,20 @@
+package com.usai.redant.apexdrivers.home;
+
+import com.usai.redant.apexdrivers.base.BasicObject;
+
+public class HomeHeaderModel extends BasicObject {
+
+    public boolean driver_available;
+    public int message_count;
+    public int new_count;
+    public int processing_count;
+    public int finish_count;
+
+    public void reset() {
+        driver_available = false;
+        message_count = 0;
+        new_count = 0;
+        processing_count = 0;
+        finish_count = 0;
+    }
+}

+ 4 - 1
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeHeaderView.java

@@ -62,8 +62,11 @@ public class HomeHeaderView extends RelativeLayout {
     private HomeHeaderDelegate delegate;
     private int newCount,processingCount,finishCount;
 
+    public void init() {
 
-    private void init() {
+        if (initialized) {
+            return;
+        }
 
         newContainer = findViewById(R.id.new_count_container);
         processingContainer = findViewById(R.id.processing_count_container);

+ 48 - 3
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeMoreActivity.java

@@ -49,6 +49,7 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
     private final static String SavedJsonKey = "SavedJsonKey";
     private final static String SavedOrderTypeKey = "SavedOrderTypeKey";
     private final static String SavedTitleKey = "SavedTitleKey";
+    private final static  String SavedFirstVisible = "SavedFirstVisible";
 
 
     private final static int REQUEST_ORDER_FILTER_CODE = 0;
@@ -86,6 +87,7 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
 
     private boolean reloadHome = false;
     private TextView mEmptyView;
+    private int mFirstVisible = 0;
 
     private HomeMoreBroadCastReceiver mReceiver;
 
@@ -138,6 +140,16 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
                     e.printStackTrace();
                 }
             }
+
+            if (mOrders.size() != 0) {
+                final int tmpVisible = savedInstanceState.getInt(SavedFirstVisible);
+                mListView.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mListView.setSelection(tmpVisible);
+                    }
+                });
+            }
         }
 
         if (mOrders.size() == 0) {
@@ -206,6 +218,7 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
             outState.putString(SavedTitleKey,mTitle);
         }
 
+        outState.putInt(SavedFirstVisible,mFirstVisible);
     }
 
     @Override
@@ -246,21 +259,41 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
                 if (model.orderNo != null) {
                     json.put("orderNo",model.orderNo);
                 }
-                if (model.orderID != null) {
-                    json.put("orderID",model.orderID);
-                }
+
                 if (model.containerNo != null) {
                     json.put("containerNo",model.containerNo);
                 }
                 if (model.date != null) {
                     json.put("date",model.date);
                 }
+
+                if (model.orderID != null) {
+                    json.put("orderID",model.orderID);
+                }
+
+                json.put("selected",model.selected);
+
                 if (model.order_type2 != null) {
                     json.put("order_type2",model.order_type2);
                 }
                 if (model.iconURL != null) {
                     json.put("iconURL",model.iconURL);
                 }
+
+                json.put("backendFlag",model.backendFlag);
+
+                if (model.status_no != null) {
+                    json.put("status_no",model.status_no);
+                }
+
+                if (model.color != null) {
+                    json.put("color",model.color);
+                }
+
+                if (model.order_type != null) {
+                    json.put("order_type",model.order_type);
+                }
+
                 orders.put(json);
             }
 
@@ -341,6 +374,18 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
             }
         });
         mListView.setEmptyView(findViewById(R.id.home_more_empty_view));
+
+        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView view, int scrollState) {
+
+            }
+
+            @Override
+            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+                mFirstVisible = firstVisibleItem;
+            }
+        });
     }
 
 

+ 3 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeOrderModel.java

@@ -124,4 +124,7 @@ public class HomeOrderModel {
         void refresh();
     }
 
+    public void clearDelegate() {
+        delegate = null;
+    }
 }

+ 26 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/message/MessageActivity.java

@@ -56,6 +56,8 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
 
     private static final String SavedMessagesKey = "SavedMessages";
     private static final String SavedUnreadKey = "SavedUnread";
+    private final static  String SavedFirstVisible = "SavedFirstVisible";
+
 
     private Context mCtx = this;
     private MessageActivity self = this;
@@ -70,6 +72,7 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
     private int offset = 0;
     private static final int limit = 20;
     private boolean mUnread = true;
+    private int mFirstVisible = 0;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -112,6 +115,16 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
             boolean unread = savedInstanceState.getBoolean(SavedUnreadKey);
             mUnread = unread;
 
+            if (messages.size() != 0) {
+
+                final int tmpVisible = savedInstanceState.getInt(SavedFirstVisible);
+                mListView.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mListView.setSelection(tmpVisible);
+                    }
+                });
+            }
         } //
 
         if (messages.size() == 0) {
@@ -170,6 +183,7 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
             outState.putString(SavedMessagesKey,array.toString());
         }
         outState.putBoolean(SavedUnreadKey,mUnread);
+        outState.putInt(SavedFirstVisible,mFirstVisible);
     }
 
     private void unreadBtnClick(boolean unread) {
@@ -252,6 +266,18 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
             }
         });
         mListView.setEmptyView(findViewById(R.id.message_empty_view));
+
+        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView view, int scrollState) {
+
+            }
+
+            @Override
+            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+                mFirstVisible = firstVisibleItem;
+            }
+        });
     }
 
     /**

+ 69 - 11
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/setting/SettingActivity.java

@@ -5,6 +5,7 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Handler;
+import android.os.PersistableBundle;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.app.AppCompatActivity;
@@ -18,6 +19,7 @@ import android.widget.Toast;
 
 import com.usai.redant.apexdrivers.ApexDriverApplication;
 import com.usai.redant.apexdrivers.R;
+import com.usai.redant.apexdrivers.SaveInstanceHelper;
 import com.usai.redant.apexdrivers.base.BasicActivity;
 import com.usai.redant.apexdrivers.network.Network;
 import com.usai.redant.apexdrivers.setting.changepassword.ChangePasswordDialog;
@@ -52,9 +54,9 @@ public class SettingActivity extends BasicActivity implements SettingAdapter.Set
 
     private ExpandableListView mListView;
     private SettingAdapter mAdapter;
-    private ArrayList<SectionModel> mSections;
     private Context mCtx = this;
 
+    private ArrayList<SectionModel> mSections;
     private OptionModel mClickedOptionModel = null;
 
     @Override
@@ -71,7 +73,6 @@ public class SettingActivity extends BasicActivity implements SettingAdapter.Set
         setTitle(getString(R.string.setting_title));
 
         mSections = new ArrayList<>();
-        loadData();
 
         mAdapter = new SettingAdapter(mCtx,this,mSections);
 
@@ -121,18 +122,60 @@ public class SettingActivity extends BasicActivity implements SettingAdapter.Set
         });
         mListView.addFooterView(LayoutInflater.from(mCtx).inflate(R.layout.setting_footer,null));
 
-        /**
-         *
-         *  打开所有Group,否则默认关闭
-         *
-         * */
-        if (mSections.size() > 0) {
-            for (int i = 0; i < mSections.size(); i++) {
-                mListView.expandGroup(i);
+        if (savedInstanceState != null) {
+
+            recovery();
+
+        } else {
+            loadData();
+            changeData();
+        }
+
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+
+        recovery();
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
+        super.onSaveInstanceState(outState, outPersistentState);
+
+        SaveInstanceHelper.SettingSaveHelper helper = SaveInstanceHelper.getInstance().getSettingSaveHelper();
+        helper.mSections = mSections;
+        helper.mClickedOptionModel = mClickedOptionModel;
+        helper.saved = true;
+
+        resetModelDelegate();
+    }
+
+    private void resetModelDelegate() {
+
+        for (SectionModel model : mSections) {
+            model.resetDelegate();
+        }
+    }
+
+    private void recovery() {
+
+        SaveInstanceHelper.SettingSaveHelper helper = SaveInstanceHelper.getInstance().getSettingSaveHelper();
+        if (helper.saved) {
+            if (helper.mSections != null) {
+                ArrayList<SectionModel> sections = new ArrayList<>();
+                sections.addAll(helper.mSections);
+
+                mSections.clear();
+                mSections.addAll(sections);
             }
+
+            mClickedOptionModel = helper.mClickedOptionModel;
+            helper.clear();
         }
-        mAdapter.notifyDataSetChanged();
 
+        changeData();
     }
 
     @Override
@@ -166,6 +209,21 @@ public class SettingActivity extends BasicActivity implements SettingAdapter.Set
 
     }
 
+    private void changeData() {
+
+        /**
+         *
+         *  打开所有Group,否则默认关闭
+         *
+         * */
+        if (mSections.size() > 0) {
+            for (int i = 0; i < mSections.size(); i++) {
+                mListView.expandGroup(i);
+            }
+        }
+        mAdapter.notifyDataSetChanged();
+    }
+
     public void loadData() {
 
         mSections.clear();

+ 5 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/setting/model/BaseModel.java

@@ -29,4 +29,9 @@ public class BaseModel extends BasicObject {
     public ModelDelegate getDelegate() {
         return delegate;
     }
+
+    public void resetDelegate() {
+
+        setDelegate(null);
+    }
 }

+ 11 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/setting/model/SectionModel.java

@@ -74,4 +74,15 @@ public class SectionModel extends BasicObject {
             this.settings = null;
         }
     }
+
+    public void resetDelegate() {
+
+        if (settings == null || settings.size() == 0) {
+            return;
+        }
+
+        for (BaseModel baseModel : settings) {
+            baseModel.resetDelegate();
+        }
+    }
 }

+ 23 - 20
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateActivity.java

@@ -314,6 +314,7 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
         saveHelper.mSignatueModel = mSignatueModel;
         saveHelper.photoFile = photoFile;
         saveHelper.mPhotoArray = mPhotoArray;
+        saveHelper.saved = true;
 
         clearModelDelegate();
     }
@@ -329,33 +330,35 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
     private void recovery() {
 
         SaveInstanceHelper.UpdateSaveHelper saveHelper = SaveInstanceHelper.getInstance().getUpdateSaveHelper();
+        if (saveHelper.saved) {
 
-        ArrayList<UpdateSectionModel> sections = saveHelper.mSectionArray;
-        if (sections != null) {
+            ArrayList<UpdateSectionModel> sections = saveHelper.mSectionArray;
+            if (sections != null) {
 
-            ArrayList<UpdateSectionModel> tmp = new ArrayList<>();
-            tmp.addAll(sections);
+                ArrayList<UpdateSectionModel> tmp = new ArrayList<>();
+                tmp.addAll(sections);
 
-            mSectionArray.clear();
-            mSectionArray.addAll(tmp);
-        }
-        mPhotoItemModel = saveHelper.mPhotoItemModel;
-        mPhotoModel = saveHelper.mPhotoModel;
-        mSignatueModel = saveHelper.mSignatueModel;
-        mInputModel = saveHelper.mInputModel;
-        photoFile = saveHelper.photoFile;
+                mSectionArray.clear();
+                mSectionArray.addAll(tmp);
+            }
+            mPhotoItemModel = saveHelper.mPhotoItemModel;
+            mPhotoModel = saveHelper.mPhotoModel;
+            mSignatueModel = saveHelper.mSignatueModel;
+            mInputModel = saveHelper.mInputModel;
+            photoFile = saveHelper.photoFile;
 
-        ArrayList<File> tmpPhotos = saveHelper.mPhotoArray;
-        if (tmpPhotos != null) {
+            ArrayList<File> tmpPhotos = saveHelper.mPhotoArray;
+            if (tmpPhotos != null) {
 
-            ArrayList<File> tmp = new ArrayList<>();
-            tmp.addAll(tmpPhotos);
+                ArrayList<File> tmp = new ArrayList<>();
+                tmp.addAll(tmpPhotos);
 
-            mPhotoArray.clear();
-            mPhotoArray.addAll(tmp);
-        }
+                mPhotoArray.clear();
+                mPhotoArray.addAll(tmp);
+            }
 
-        saveHelper.clear();
+            saveHelper.clear();
+        }
 
         changeData();
     }