</intent-filter>
</activity>
- <activity android:name=".MainActivity">
+ <activity android:name=".MainActivity"
+ android:configChanges="keyboardHidden|orientation|screenSize|locale|screenLayout|mcc|mnc">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
import androidx.fragment.app.FragmentTransaction;
import com.ic.launcher.fragment.AppListFragment;
+import com.ic.launcher.fragment.BaseFragment;
import com.ic.launcher.fragment.L02MainFragment;
import com.ic.launcher.fragment.LowPowerModeFragment;
import com.ic.launcher.fragment.clock.Clock12DialFragment;
private FragmentManager ftManager;
+
FragmentManage(Context context, FragmentManager ftManager) {
this.ftManager = ftManager;
mAddFt = new SparseArray<>();
* 可能的值为 {@link Clock6DialFragment} 或者 {@link Clock12DialFragment} 模拟表盘
*/
- void showCurrMainFragment(boolean finish) {
+ void showCurrMainFragment(boolean finish, int direction) {
Fragment fragment = getFragmentList(MAIN_FRAGMENT_INDEX);
if (fragment == null) {
fragment = getCurrMainFragment();
addFragmentList(MAIN_FRAGMENT_INDEX, fragment);
}
+ ((BaseFragment) fragment).setEnterDirection(direction);
addOrShowFragment(finish, fragment);
}
}
if (mAddFt.get(1).isVisible()) {
- showCurrMainFragment(finish);
+ showCurrMainFragment(finish, 0);
return true;
}
FragmentTransaction ft = ftManager.beginTransaction();
Fragment dd = mAddFt.get(MAIN_FRAGMENT_INDEX);
- if(dd != null){
+ if (dd != null) {
ft.remove(mAddFt.get(MAIN_FRAGMENT_INDEX));
mAddFt.remove(MAIN_FRAGMENT_INDEX);
}
}
}
- ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
+ ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if (fragment.isAdded()) {
ft.show(fragment);
import android.app.Application;
+import com.ic.launcher.presenter.AppListPresenter;
import com.ic.launcher.presenter.BatteryPresenter;
+import com.ic.launcher.presenter.HardwarePresenter;
+import com.ic.launcher.presenter.PhoneStatePresenter;
import com.ic.launcher.presenter.TimeDatePresenter;
import com.ic.launcher.util.CrashHandler;
import com.ic.launcher.util.IcLog;
private TimeDatePresenter timeDatePresenter;
private BatteryPresenter batteryPresenter;
+ private AppListPresenter appListPresenter;
+ private HardwarePresenter hardwarePresenter;
+ private PhoneStatePresenter phonePresenter;
@Override
public void onCreate() {
timeDatePresenter = new TimeDatePresenter(this);
batteryPresenter = new BatteryPresenter(this);
+ appListPresenter = new AppListPresenter(this);
+ hardwarePresenter = new HardwarePresenter(this);
+ phonePresenter = new PhoneStatePresenter(this);
}
public TimeDatePresenter getTimeDatePresenter() {
public BatteryPresenter getBatteryPresenter() {
return batteryPresenter;
}
+
+ public AppListPresenter getAppListPresenter() {
+ return appListPresenter;
+ }
+
+ public HardwarePresenter getHardwarePresenter() {
+ return hardwarePresenter;
+ }
+
+ public PhoneStatePresenter getPhonePresenter() {
+ return phonePresenter;
+ }
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ftManage = new FragmentManage(this,getSupportFragmentManager());
- ftManage.showCurrMainFragment(isFinishing());
+ ftManage.showCurrMainFragment(isFinishing(),0);
((IcLauncherApplication)getApplication()).getBatteryPresenter().registerBatteryReceiver();
((IcLauncherApplication)getApplication()).getTimeDatePresenter().registerTimeDateReceiver();
registerChangeClockReceiver();
ServiceUtil.startServiceUtil(getApplicationContext(),
- "com.ic.action.WORK_SERVICE", getPackageName());
+ "com.ic.action.WORK_SERVICE", getPackageName());
}
@Override
}
@Override
- public void onChangeMain() {
- ftManage.showCurrMainFragment(isFinishing());
+ public void onChangeMain(int direction) {
+ ftManage.showCurrMainFragment(isFinishing(),direction);
}
@Override
import android.os.Bundle;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.PluralsRes;
import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager2.widget.ViewPager2;
+import android.os.SystemClock;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
import android.widget.Toast;
import com.ic.launcher.IcLauncherApplication;
import com.ic.launcher.mode.AppModel;
import com.ic.launcher.util.IcLog;
+import static java.lang.Math.abs;
+
public class AppListFragment extends Fragment {
private static final String TAG = "AppListFragment";
private Context mContext;
- private RecyclerView mAppRv;
+ private ViewPager2 mAppRv;
private AppModel appModel;
- private IChangeMainFragmentListener changeMainFragmentListener;
+ private IChangeMainFragmentListener changeListener;
private AppInfoAdapter appAdapter;
private RecyclerView indicatorRv;
private IndicatorAdapter indicatorAdapter;
+ private int pageTranslationX;
+
//1 显示第一个 2 显示最后一个
private int mCurrType;
+ private int mEntryDirection;
+ private boolean isExecute = false;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
mContext = context;
if (context instanceof IChangeMainFragmentListener) {
- changeMainFragmentListener = (IChangeMainFragmentListener) context;
+ changeListener = (IChangeMainFragmentListener) context;
}
}
AppListFragment fragment = new AppListFragment();
Bundle args = new Bundle();
args.putInt("type", type);
+ args.putInt("direction", type);
fragment.setArguments(args);
return fragment;
}
Bundle bundle = getArguments();
if (bundle != null) {
mCurrType = bundle.getInt("type");
+ mEntryDirection = bundle.getInt("direction");
}
appModel = initFragmentModel();
super.onResume();
if (mCurrType == 2) {
//只有初始化进来的时候才执行,
- mAppRv.scrollToPosition(appAdapter.getAppEndIndex());
+ mAppRv.setCurrentItem(appAdapter.getAppEndIndex(), false);
indicatorAdapter.updateIndicatorState(appAdapter.getAppEndIndex());
- mCurrType = 0;
+ mCurrType = -1;
}
}
public void setMoveEndItem(boolean move) {
if (move) {
- mAppRv.scrollToPosition(appAdapter.getAppEndIndex());
+ mAppRv.setCurrentItem(appAdapter.getAppEndIndex(), false);
indicatorAdapter.updateIndicatorState(appAdapter.getAppEndIndex());
+ mEntryDirection = 2;
} else {
- mAppRv.scrollToPosition(0);
+ mAppRv.setCurrentItem(0, false);
indicatorAdapter.updateIndicatorState(0);
+ mEntryDirection = 1;
}
+
+ isExecute = false;
}
private AppModel initFragmentModel() {
private void initRecyclerView() {
appAdapter = new AppInfoAdapter(mContext, itemListener);
- LinearLayoutManager mLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
-
- mAppRv.setLayoutManager(mLayoutManager);
mAppRv.setAdapter(appAdapter);
+ mAppRv.registerOnPageChangeCallback(scrollListener);
+ mAppRv.setOffscreenPageLimit(1);
+ int nextItemVisiblePx = (int) getResources().getDimension(R.dimen.app_next_item_visible);
+ int currentItemHorizontalMarginPx = (int) getResources().getDimension(R.dimen.app_current_item_horizontal_margin);
+ pageTranslationX = nextItemVisiblePx + currentItemHorizontalMarginPx;
- new PagerSnapHelper().attachToRecyclerView(mAppRv);
+ mAppRv.setPageTransformer(new CustomPageTransformer());
+ mAppRv.addItemDecoration(new SpacesItemDecoration(currentItemHorizontalMarginPx));
- mAppRv.addOnScrollListener(scrollListener);
+ ((RecyclerView) mAppRv.getChildAt(0)).setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);
}
private void initIndicator(boolean[] state) {
indicatorRv.setAdapter(indicatorAdapter);
}
- private RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
+ private ViewPager2.OnPageChangeCallback scrollListener = new ViewPager2.OnPageChangeCallback() {
private boolean isJudge = true;
+ private int pos = -1;
@Override
- public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
- super.onScrollStateChanged(recyclerView, newState);
- //IcLog.i(TAG, "newState:" + newState);
- switch (newState) {
- case RecyclerView.SCROLL_STATE_IDLE:
- judgeItemPosition(recyclerView, isJudge);
- break;
- case RecyclerView.SCROLL_STATE_DRAGGING:
- isJudge = true;
- break;
- case RecyclerView.SCROLL_STATE_SETTLING:
- isJudge = false;
- break;
- }
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ super.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
@Override
- public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
- super.onScrolled(recyclerView, dx, dy);
+ public void onPageSelected(int position) {
+ super.onPageSelected(position);
+ IcLog.i(TAG, "onPageSelected:" + position);
+ indicatorAdapter.updateIndicatorState(position);
+ pos = position;
+ isExecute = false;
}
- private void judgeItemPosition(RecyclerView recyclerView, boolean isJudge) {
- LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
- if (manager == null) return;
- //获取最后一个完全显示的ItemPosition ,角标值
- int first = manager.findFirstVisibleItemPosition();
- indicatorAdapter.updateIndicatorState(first);
- if (!isJudge) {
- return;
- }
- int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
- //所有条目,数量值
- int totalItemCount = manager.getItemCount();
-
- // 判断是否滚动到底部,并且是向右滚动
- if (lastVisibleItem == (totalItemCount - 1)) {
- //加载更多功能的代码
- IcLog.i(TAG, "lastVisibleItem:" + lastVisibleItem);
- changeMainFragmentListener.onChangeMain();
- }
-
- if (lastVisibleItem == 0) {
- //加载更多功能的代码
- IcLog.i(TAG, "Start VisibleItem:" + lastVisibleItem);
- changeMainFragmentListener.onChangeMain();
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ super.onPageScrollStateChanged(state);
+ switch (state) {
+ case ViewPager2.SCROLL_STATE_IDLE:
+ IcLog.i(TAG, "newState:" + state + ",isExecute:" + isExecute);
+ if (isJudge && !isExecute) {
+ if (pos == 0) {
+ changeListener.onChangeMain(1);
+ } else if (pos == appAdapter.getAppEndIndex()) {
+ changeListener.onChangeMain(2);
+ }
+ isExecute = true;
+ }
+ break;
+ case ViewPager2.SCROLL_STATE_DRAGGING:
+ isJudge = true;
+ break;
+ case ViewPager2.SCROLL_STATE_SETTLING:
+ isJudge = false;
+ break;
}
}
};
}
}
+ public class CustomPageTransformer implements ViewPager2.PageTransformer {
+ @Override
+ public void transformPage(@NonNull View page, float position) {
+ page.setTranslationX(-pageTranslationX * position);
+ page.setScaleY(1 - (0.25f * abs(position)));
+ page.setScaleX(1 - (0.25f * abs(position)));
+ }
+ }
+
private ICheckAppItemListener itemListener = pos -> appModel.onStartAppActivity(pos);
+
+
+ @Nullable
+ @Override
+ public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
+ IcLog.i(TAG, "CreateAnimation transit" + transit + ",enter:" + enter + ",nextAnim" + nextAnim);
+ if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN && enter) {
+ switch (mEntryDirection) {
+ case 1:
+ return AnimationUtils.loadAnimation(getContext(), R.anim.slide_right_to_left);
+ case 2:
+ return AnimationUtils.loadAnimation(getContext(), R.anim.slide_left_to_right);
+ }
+ }
+ return null;
+ }
}
import android.content.Context;
import android.os.Bundle;
import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.GestureDetectorCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentTransaction;
import com.ic.launcher.IcLauncherApplication;
+import com.ic.launcher.R;
import com.ic.launcher.listener.MainClockGestureDetectorImpl;
import com.ic.launcher.mode.BaseModel;
import com.ic.launcher.util.IcLog;
private GestureDetectorCompat gesture;
private MainClockGestureDetectorImpl.OnClockGestureFlingListener flingListener;
+ private int mEntryDirection=0;
+
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
return true;
});
}
+
+ public void setEnterDirection(int direction){
+ IcLog.i(TAG,"setEnterDirection:"+mEntryDirection);
+ mEntryDirection = direction;
+ }
+
+
+ @Nullable
+ @Override
+ public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
+ IcLog.i(TAG,"CreateAnimation transit"+transit+",enter:"+enter+",nextAnim"+nextAnim+",mEntryDirection:"+mEntryDirection);
+ if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN && enter) {
+ /**switch (mEntryDirection){
+ case 1:
+ return AnimationUtils.loadAnimation(getContext(), R.anim.slide_left_to_right);
+ case 2:
+ return AnimationUtils.loadAnimation(getContext(), R.anim.slide_right_to_left);
+ }**/
+ }
+ return super.onCreateAnimation(transit,enter,nextAnim);
+ }
}
package com.ic.launcher.listener;
public interface IChangeMainFragmentListener {
- void onChangeMain();
+ void onChangeMain(int direction);
}
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
+import com.ic.launcher.IcLauncherApplication;
import com.ic.launcher.entity.AppInfoEntity;
import com.ic.launcher.presenter.AppListPresenter;
private AppModel(Application application) {
super(application);
- appListPresenter = new AppListPresenter(application);
+ appListPresenter = ((IcLauncherApplication)application).getAppListPresenter();
}
public void OnUiDestroy() {
for (int i = 0; i < mPresenter.size(); i++) {
mPresenter.valueAt(i).onPresenterDestroy();
- mPresenter.remove(i);
}
}
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
+import com.ic.launcher.IcLauncherApplication;
import com.ic.launcher.presenter.BatteryPresenter;
import com.ic.launcher.presenter.HardwarePresenter;
import com.ic.launcher.presenter.PhoneStatePresenter;
private L02MainModel(Application application) {
super(application);
- PhoneStatePresenter phonePresenter = new PhoneStatePresenter(application.getApplicationContext());
- HardwarePresenter hardwarePresenter = new HardwarePresenter(application.getApplicationContext());
+ PhoneStatePresenter phonePresenter = ((IcLauncherApplication)application).getPhonePresenter();
+ HardwarePresenter hardwarePresenter = ((IcLauncherApplication)application).getHardwarePresenter();
addPresenterList(PHONE_LIST_INDEX,phonePresenter);
addPresenterList(HARDWARE_LIST_INDEX,hardwarePresenter);
}
mQueryThread = null;
-
- if(queryState != null){
- queryState.destroyPhoneState();
- }
- queryState=null;
}
public PhoneStatePresenter(Context context) {
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:duration="@android:integer/config_mediumAnimTime">
+ <translate
+ android:fromXDelta="-100%p"
+ android:toXDelta="0.0"
+ android:duration="100"
+ android:fillBefore="true"/>
+</set>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:duration="@android:integer/config_mediumAnimTime">
+ <translate
+ android:fromXDelta="100%p"
+ android:toXDelta="0.0"
+ android:duration="100"
+ android:fillBefore="true"/>
+
+</set>
\ No newline at end of file
android:layout_height="match_parent"
tools:context=".fragment.AppListFragment">
- <androidx.recyclerview.widget.RecyclerView
+ <androidx.viewpager2.widget.ViewPager2
android:id="@+id/app_list"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:overScrollMode="never"/>
+ android:layout_height="match_parent"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/app_indicator_rv"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:onClick="@{() -> click.onAppItem(pos)}">
+ android:onClick="@{() -> click.onAppItem(pos)}"
+ android:background="@android:color/transparent">
<ImageView
android:id="@+id/app_icon_iv"
<dimen name="viewpager_next_item_visible">26dp</dimen>
<dimen name="viewpager_current_item_horizontal_margin">42dp</dimen>
+
+ <dimen name="app_next_item_visible">26dp</dimen>
+ <dimen name="app_current_item_horizontal_margin">42dp</dimen>
</resources>
\ No newline at end of file
-#Tue Mar 31 10:20:58 CST 2020
-VERSION_CODE=27
+#Thu Apr 02 19:06:12 CST 2020
+VERSION_CODE=29