diff --git a/app/build.gradle b/app/build.gradle index 440cdd5..76e980b 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,10 @@ android { packagingOptions { exclude 'META-INF/DEPENDENCIES' } + + testOptions { + unitTests.returnDefaultValues = true + } } @@ -37,8 +41,9 @@ dependencies { implementation 'com.github.razerdp:BasePopup:2.2.0' + //BasePopup androidx支持库(针对以上两个支持的androidX版本) - //implementation 'com.github.razerdp:BasePopup-compat-androidx:2.1.8' + //implementation 'com.github.razerdp:BasePopup-compat-androidx:2.2.0' implementation 'com.haibin:calendarview:3.6.2' implementation 'androidx.annotation:annotation:1.0.2' @@ -60,10 +65,19 @@ dependencies { // ViewModel and LiveData implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' - implementation('com.gitee.51danju.e-odbo:e-odbo-jdbc:V1.0-beta.1') + implementation('com.gitee.51danju.e-odbo:e-odbo-jdbc:V1.0-beta.3') { - exclude(group: 'org.apache.logging.log4j', module: 'log4j-core') + exclude(group: 'org.apache.logging.log4j', module: '*') + //exclude(group: 'org.apache.logging.log4j', module: 'log4j-core') + //exclude(group: 'org.apache.logging.log4j', module: 'log4j-api') + //exclude(group: 'org.apache.logging.log4j', module: 'log4j-jcl') + //exclude(group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl') + //exclude(group: 'org.slf4j', module: 'slf4j-api') } + + implementation 'org.slf4j:slf4j-android:1.7.26' + //implementation 'com.github.tony19:logback-android-core:1.0.7-1' + implementation 'org.sqldroid:sqldroid:1.1.0-rc1' implementation "com.github.DeweyReed:UltimateMusicPicker:2.0.4" diff --git a/app/src/main/java/clock/socoolby/com/clock/AnimatorManager.java b/app/src/main/java/clock/socoolby/com/clock/AnimatorManager.java new file mode 100644 index 0000000..1519da7 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/AnimatorManager.java @@ -0,0 +1,155 @@ +package clock.socoolby.com.clock; + +import clock.socoolby.com.clock.widget.animatorview.I_Animator; +import clock.socoolby.com.clock.widget.animatorview.animator.BubbleAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.BubbleCollisionAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.BubbleWhirlPoolAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.CarrouselAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.DotsLineAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.FireAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.FireworkAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.FluorescenceAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.MagicLineAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.PhaserBallAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.RainAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.SawtoothAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.SkyAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.SnowAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.StarFallAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.VorolayAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.WaterAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.Wave3DAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.WindmillAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.textanimator.EZLedAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.textanimator.EvaporateTextAnimator; + +public class AnimatorManager { + + public static final String DEFAULT = "NULL"; + + int currnetIndex = -1; + + public final static String[] ANIMATOR_NAMES = new String[]{ + StarFallAnimator.NAME, + SkyAnimator.NAME, + RainAnimator.NAME, + SnowAnimator.NAME, + BubbleWhirlPoolAnimator.NAME, + BubbleAnimator.NAME, + FluorescenceAnimator.NAME, + BubbleCollisionAnimator.NAME, + FireworkAnimator.NAME, + DotsLineAnimator.NAME, + WaterAnimator.NAME, + FireAnimator.NAME, + SawtoothAnimator.NAME, + WindmillAnimator.NAME, + VorolayAnimator.NAME, + EZLedAnimator.NAME, + EvaporateTextAnimator.NAME, + PhaserBallAnimator.NAME, + CarrouselAnimator.NAME, + Wave3DAnimator.NAME, + MagicLineAnimator.NAME + }; + + public I_Animator configByName(String name) { + if (DEFAULT.equalsIgnoreCase(name)) { + currnetIndex = -1; + return null; + } + currnetIndex = -1; + for (int index = 0; index < ANIMATOR_NAMES.length; index++) { + if (ANIMATOR_NAMES[index].equalsIgnoreCase(name)) { + currnetIndex = index; + break; + } + } + return getCurrentAnimator(); + } + + public String next() { + currnetIndex++; + if (currnetIndex >= ANIMATOR_NAMES.length) + currnetIndex = -1; + return getCurrentAnimatorName(); + } + + public String getCurrentAnimatorName(){ + if (currnetIndex == -1) + return DEFAULT; + return ANIMATOR_NAMES[currnetIndex]; + } + + private I_Animator getCurrentAnimator() { + if (currnetIndex == -1) + return null; + I_Animator animator = null; + switch (ANIMATOR_NAMES[currnetIndex]) { + case StarFallAnimator.NAME: + animator = new StarFallAnimator(); + break; + case SkyAnimator.NAME: + animator = new SkyAnimator(); + break; + case RainAnimator.NAME: + animator = new RainAnimator(); + break; + case SnowAnimator.NAME: + animator = new SnowAnimator(); + break; + case BubbleWhirlPoolAnimator.NAME: + animator = new BubbleWhirlPoolAnimator(); + break; + case BubbleAnimator.NAME: + animator = new BubbleAnimator(); + break; + case FluorescenceAnimator.NAME: + animator = new FluorescenceAnimator(); + break; + case BubbleCollisionAnimator.NAME: + animator = new BubbleCollisionAnimator(); + break; + case FireworkAnimator.NAME: + animator = new FireworkAnimator(); + break; + case DotsLineAnimator.NAME: + animator = new DotsLineAnimator(); + break; + case WaterAnimator.NAME: + animator = new WaterAnimator(); + break; + case FireAnimator.NAME: + animator = new FireAnimator(); + break; + case SawtoothAnimator.NAME: + animator = new SawtoothAnimator(); + break; + case WindmillAnimator.NAME: + animator = new WindmillAnimator(); + break; + case VorolayAnimator.NAME: + animator = new VorolayAnimator(); + break; + case EZLedAnimator.NAME: + animator = new EZLedAnimator(); + break; + case EvaporateTextAnimator.NAME: + animator = new EvaporateTextAnimator(); + break; + case PhaserBallAnimator.NAME: + animator = new PhaserBallAnimator(); + break; + case CarrouselAnimator.NAME: + animator = new CarrouselAnimator(); + break; + case Wave3DAnimator.NAME: + animator = new Wave3DAnimator(); + break; + case MagicLineAnimator.NAME: + animator = new MagicLineAnimator(); + break; + } + return animator; + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/ClockApplication.java b/app/src/main/java/clock/socoolby/com/clock/ClockApplication.java index 3955985..94a7133 100755 --- a/app/src/main/java/clock/socoolby/com/clock/ClockApplication.java +++ b/app/src/main/java/clock/socoolby/com/clock/ClockApplication.java @@ -7,13 +7,21 @@ import android.util.Log; import com.blankj.utilcode.constant.PermissionConstants; import com.blankj.utilcode.util.PermissionUtils; import com.blankj.utilcode.util.Utils; +import com.openbravo.data.basic.BasicException; +import com.openbravo.data.loader.DBSession; +import com.openbravo.data.loader.TableDBSentenceBuilder; +import com.openbravo.data.loader.dialect.SQLite.SQLite; +import clock.socoolby.com.clock.dao.base.ThemeUIDao; +import clock.socoolby.com.clock.dao.base.TimeFontStyleDao; +import clock.socoolby.com.clock.db.WorkClockDatabase; import clock.socoolby.com.clock.protocol.BusinessService; import clock.socoolby.com.clock.model.DateModel; import clock.socoolby.com.clock.utils.FileUtils; import clock.socoolby.com.clock.model.SharePerferenceModel; +import e.odbo.DB; import e.odbo.data.dao.EntityManager; - +import e.odbo.data.sample.security.NoScuritySupportManager; public class ClockApplication extends Application { @@ -34,6 +42,25 @@ public class ClockApplication extends Application { sEndzoneBoxApp = this; Utils.init(this); init(); + initEnityManager(); + } + + private void initEnityManager() { + DB localDB=null; + WorkClockDatabase database=new WorkClockDatabase(); + try { + localDB= SQLite.androidWithSQLDroid(this.getPackageName(),Constants.APP_NAME,null,null); + Log.d("e","setup database start...."); + localDB.setup(database); + }catch (BasicException e){ + Log.e("e","setup database false",e); + } + localDB.model(database); + Log.d("e","init database end...."); + DBSession dbSession=(DBSession) localDB.getDbSession(); + entityManager=new EntityManager(dbSession,new TableDBSentenceBuilder(dbSession,new NoScuritySupportManager())); + entityManager.addDaoToMap(new TimeFontStyleDao(dbSession)); + entityManager.addDaoToMap(new ThemeUIDao(dbSession)); } diff --git a/app/src/main/java/clock/socoolby/com/clock/Constants.java b/app/src/main/java/clock/socoolby/com/clock/Constants.java index ee4a354..8cb6903 100644 --- a/app/src/main/java/clock/socoolby/com/clock/Constants.java +++ b/app/src/main/java/clock/socoolby/com/clock/Constants.java @@ -1,6 +1,8 @@ package clock.socoolby.com.clock; public class Constants { + public static final String APP_NAME="workclock"; + public final static String CLOCK_FOLDER="/CoolClock/"; public final static int TALKING_HALF_AN_HOUR=1; public final static int TALKING_HOURS=2; diff --git a/app/src/main/java/clock/socoolby/com/clock/FontManager.java b/app/src/main/java/clock/socoolby/com/clock/FontManager.java index d05b4fc..4af890e 100644 --- a/app/src/main/java/clock/socoolby/com/clock/FontManager.java +++ b/app/src/main/java/clock/socoolby/com/clock/FontManager.java @@ -1,9 +1,12 @@ package clock.socoolby.com.clock; +import com.openbravo.data.basic.BasicException; + import java.util.ArrayList; import java.util.List; import clock.socoolby.com.clock.dao.base.TimeFontStyle; +import e.odbo.data.dao.EntityManager; public class FontManager { @@ -13,72 +16,27 @@ public class FontManager { private int currentFontIndex; - public FontManager() { - initTimeFontStyle(); + EntityManager entityManager; + + public FontManager(EntityManager entityManager) { + this.entityManager=entityManager; + //initTimeFontStyle(); + loadForDB(); currentFontIndex=0; currentFontStyle=fontStyleList.get(currentFontIndex); } - private void initTimeFontStyle(){ - fontStyleList=new ArrayList<>(); - fontStyleList.add(new TimeFontStyle("affair",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("agenda",140,150,160,180)); - - fontStyleList.add(new TimeFontStyle("cheapfire",140,150,160,180)); - fontStyleList.add(new TimeFontStyle("cherif",80,100,110,140)); - fontStyleList.add(new TimeFontStyle("Cigar Box Guitar",120,130,140,150)); - fontStyleList.add(new TimeFontStyle("Ciung Wanara Sejati",110,120,130,150)); - - - fontStyleList.add(new TimeFontStyle("DK Bergelmir",120,130,140,180)); - fontStyleList.add(new TimeFontStyle("ds_digi",140,150,160,200)); - - - fontStyleList.add(new TimeFontStyle("Funk",110,120,130,150)); - - fontStyleList.add(new TimeFontStyle("GLADYS Regular",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("Granite Rock St",110,120,130,170)); - fontStyleList.add(new TimeFontStyle("GROOT",120,130,140,170)); - - - fontStyleList.add(new TimeFontStyle("juleslove",110,120,130,150)); - - fontStyleList.add(new TimeFontStyle("Kingthings Annexx",110,120,150,180)); - fontStyleList.add(new TimeFontStyle("Kingthings Willow",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("KYLE Regular",110,120,130,150)); - - fontStyleList.add(new TimeFontStyle("LCD-U",130,140,150,180)); - fontStyleList.add(new TimeFontStyle("loong07龙书势如破竹简",110,120,150,170)); - - fontStyleList.add(new TimeFontStyle("MILKDROP",110,120,130,160)); - fontStyleList.add(new TimeFontStyle("Mosaicleaf086",110,120,130,150)); - - - fontStyleList.add(new TimeFontStyle("Pro Display tfb",130,140,150,170)); - - fontStyleList.add(new TimeFontStyle("SailingJunco",130,140,150,200)); - fontStyleList.add(new TimeFontStyle("scoreboard",120,130,140,190)); - fontStyleList.add(new TimeFontStyle("SFWasabi-Bold",110,120,130,140)); - fontStyleList.add(new TimeFontStyle("Spaghettica",110,120,130,150)); - - fontStyleList.add(new TimeFontStyle("the_vandor_spot",140,150,160,210)); - - fontStyleList.add(new TimeFontStyle("Woodplank",120,130,140,180)); - fontStyleList.add(new TimeFontStyle("Xtra Power",100,110,120,160)); - - fontStyleList.add(new TimeFontStyle("海报圆圆",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("爱心小兔",110,115,130,140)); - fontStyleList.add(new TimeFontStyle("王漢宗海報體一半天水",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("立体铁山硬笔行楷简",120,130,140,180)); - fontStyleList.add(new TimeFontStyle("腾祥倩心简",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("苏新诗毛糙体简",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("谁能许我扶桑花期",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("造字工房凌黑",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("中国龙新草体",110,120,130,150)); - fontStyleList.add(new TimeFontStyle("迷你简剪纸_0",110,120,130,150)); + private void loadForDB(){ + try { + fontStyleList=entityManager.list(TimeFontStyle.class); + } catch (BasicException e) { + e.printStackTrace(); + } + if(fontStyleList==null||fontStyleList.size()==0) + fontStyleList.add(DEFAULT_FONT_STYLE); } - public static final TimeFontStyle getDefaultFontSytle=new TimeFontStyle("ds_digi",140,150,160,200); + public static final TimeFontStyle DEFAULT_FONT_STYLE =new TimeFontStyle("ds_digi",140,150,160,200); public int getCurrentFontSize(boolean isFullScreen,boolean isDisplaySecond){ int fontSize=currentFontStyle.displaySecond; @@ -123,11 +81,14 @@ public class FontManager { } public void setCurrentFontName(String name){ - for(TimeFontStyle entry:fontStyleList) - if(entry.name.equalsIgnoreCase(name)){ - currentFontStyle=entry; + int index=0; + for(TimeFontStyle entry:fontStyleList) { + if (entry.name.equalsIgnoreCase(name)) { + currentFontStyle = entry; + currentFontIndex=index; } - + index++; + } } public void updateCurrentFontSize(boolean isFullScreen,boolean isDisplaySecond,int newFontSize){ @@ -144,5 +105,10 @@ public class FontManager { currentFontStyle.noDisplaySecond=newFontSize; } } + try { + entityManager.update(currentFontStyle); + } catch (BasicException e) { + e.printStackTrace(); + } } } diff --git a/app/src/main/java/clock/socoolby/com/clock/MainActivity.java b/app/src/main/java/clock/socoolby/com/clock/MainActivity.java index c555edc..98f45dd 100755 --- a/app/src/main/java/clock/socoolby/com/clock/MainActivity.java +++ b/app/src/main/java/clock/socoolby/com/clock/MainActivity.java @@ -40,11 +40,13 @@ import java.util.List; import clock.socoolby.com.clock.alter.AlterManager; import clock.socoolby.com.clock.dao.base.TimeFontStyle; -import clock.socoolby.com.clock.fragment.AlterFragment; -import clock.socoolby.com.clock.fragment.DigitClockConfigFragment; -import clock.socoolby.com.clock.fragment.DigitClockFragment; -import clock.socoolby.com.clock.fragment.SimulateClockConfigFragment; -import clock.socoolby.com.clock.fragment.SimulateClockFragment; +import clock.socoolby.com.clock.fragment.handup.AbstractHandUpFragment; +import clock.socoolby.com.clock.fragment.handup.AlterFragmentFactory; +import clock.socoolby.com.clock.fragment.digit.DigitClockConfigFragment; +import clock.socoolby.com.clock.fragment.digit.DigitClockFragment; +import clock.socoolby.com.clock.fragment.houranimator.HourAnimatorFactory; +import clock.socoolby.com.clock.fragment.simulate.SimulateClockConfigFragment; +import clock.socoolby.com.clock.fragment.simulate.SimulateClockFragment; import clock.socoolby.com.clock.fragment.ThemeUIDefaultFragment; import clock.socoolby.com.clock.fragment.ThemeUISampleFragment; import clock.socoolby.com.clock.protocol.WeatherResponse; @@ -69,11 +71,11 @@ import clock.socoolby.com.clock.widget.animatorview.animator.BubbleCollisionAnim import clock.socoolby.com.clock.widget.animatorview.animator.BubbleWhirlPoolAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.CarrouselAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.DotsLineAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.FishAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.MagicLineAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.PhaserBallAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.SawtoothAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.Wave3DAnimator; -import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.CircleTwoClock; import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.ClockFactory; import clock.socoolby.com.clock.widget.animatorview.animator.textanimator.EZLedAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.FireAnimator; @@ -121,7 +123,6 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges private PowerManager.WakeLock localWakeLock = null; - public WeatherResponse weatherAdape; private ClockTimeTypeEnum showTimeType=ClockTimeTypeEnum.TIME; @@ -137,9 +138,11 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges ThemeUIViewModel themeUIViewModel; AlterViewModel alterViewModel; - AlterManager alterManager; + private AlterManager alterManager; - //ThemeUIManager themeUIManager; + private ThemeUIManager themeUIManager; + + private AnimatorManager animatorManager; public void setWeather(WeatherResponse weather) { if (weather == null) @@ -225,7 +228,6 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges } } - private void init() { model = ((ClockApplication)getApplication()).getModel(); @@ -233,31 +235,71 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges proximityServiceIntent = new Intent(this, ProximityService.class); - fontManager=new FontManager(); - fontManager.setCurrentFontName(model.getFontName()); + fontManager=new FontManager(ClockApplication.getInstance().getEntityManager()); + //fontManager.setCurrentFontName(model.getFontName()); - alterManager=new AlterManager(model.getStartHourPowerTime(),model.getStopHourPowerTime()); + animatorManager=new AnimatorManager(); - ViewModelFactory viewModelFactory=new ViewModelFactory(model,null); + ViewModelFactory viewModelFactory=new ViewModelFactory(model); globalViewModel= ViewModelProviders.of(MainActivity.this, viewModelFactory).get(GlobalViewModel.class); digitViewModel= ViewModelProviders.of(MainActivity.this, viewModelFactory).get(DigitViewModel.class); simulateViewModel=ViewModelProviders.of(MainActivity.this, viewModelFactory).get(SimulateViewModel.class); themeUIViewModel=ViewModelProviders.of(MainActivity.this, viewModelFactory).get(ThemeUIViewModel.class); alterViewModel=ViewModelProviders.of(MainActivity.this, viewModelFactory).get(AlterViewModel.class); + alterManager=new AlterManager(model.getStartHourPowerTime(),model.getStopHourPowerTime(),globalViewModel,ClockApplication.getInstance().getEntityManager()); + clockStateMachine=new ClockStateMachine(alterManager,globalViewModel,digitViewModel,simulateViewModel,themeUIViewModel,alterViewModel); setUpProximityService(); bindViewModel(); - //themeUIManager=new ThemeUIManager(this,globalViewModel,digitViewModel,simulateViewModel,themeUIViewModel); - - digitViewModel.getTimeFontStyle().setValue(fontManager.getCurrentFontStyle()); + //digitViewModel.getTimeFontStyle().setValue(fontManager.getCurrentFontStyle()); clockStateMachine.start(); + + themeUIManager=new ThemeUIManager(ClockApplication.getInstance().getEntityManager(),model); + + testSetup(); } + int daily=30; + private void testSetup() { + + globalViewModel.getHourAlterTypeName().setValue(FishAnimator.NAME); + + /*globalViewModel.getHandUpTypeName().setValue(HandUpSelect123Fragment.NAME); + + Observer timeChange= new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + daily--; + Log.d("main activity","test hour aninamtor daily:"+daily); + if(daily==0){ + Log.d("main activity","test hour aninamtor is start!"); + globalViewModel.setTimeHourAnimatorStarting(true); + globalViewModel.getHeartbeat().removeObserver(this); + } + } + }; + globalViewModel.getHeartbeat().observe(this,timeChange);*/ + + /*try { + themeUIManager.saveDigitTheme("text",model.getDigitPerferenceModel()); + } catch (BasicException e) { + e.printStackTrace(); + } + + try { + DigitPerferenceModel digitPerferenceModel= themeUIManager.loadDigitTheme("text"); + System.out.println(digitPerferenceModel.toString()); + } catch (BasicException e) { + e.printStackTrace(); + }*/ + } + + private void bindViewModel(){ globalViewModel.getClockInterfaceTypeEnum().observe(this, new Observer() { @@ -279,7 +321,8 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges public void onChanged(ClockModeEnum clockModeEnum) { switch(clockModeEnum){ case HANDUP: - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AlterFragment(clockStateMachine)).commit(); + AbstractHandUpFragment alterFragment= AlterFragmentFactory.build(globalViewModel.getHandUpTypeName().getValue(),clockStateMachine); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, alterFragment).commit(); break; default: globalViewModel.getClockInterfaceTypeEnum().setValue(globalViewModel.getClockInterfaceTypeEnum().getValue()); @@ -300,7 +343,6 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges } }); - globalViewModel.getBackgroundImageVisable().observe(this, new Observer() { @Override public void onChanged(Boolean visible) { @@ -360,6 +402,14 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges } }); + digitViewModel.getTimeFontName().observe(this, new Observer() { + @Override + public void onChanged(String s) { + fontManager.setCurrentFontName(model.getFontName()); + digitViewModel.getTimeFontStyle().setValue(fontManager.getCurrentFontStyle()); + } + }); + digitViewModel.getTimeFontStyle().observe(this, new Observer() { @Override public void onChanged(TimeFontStyle timeFontStyle) { @@ -389,6 +439,20 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges digitViewModel.setTimeFontStyleSize(fontManager.getCurrentFontSize(themeUIViewModel.getClockUITypeEnum().getValue()==FULLSCREEN,aBoolean)); } }); + + globalViewModel.getTimeHourAnimatorStarting().observe(this, new Observer() { + @Override + public void onChanged(Boolean starting) { + Log.d(TAG, "on hour animator changed: "+starting); + if(!HourAnimatorFactory.isHourAnimator(globalViewModel.getHourAlterTypeName().getValue())) + return; + if(starting) + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, HourAnimatorFactory.builder(globalViewModel.getHourAlterTypeName().getValue(),globalViewModel.getTime_hour().getValue())).commit(); + else + globalViewModel.getClockInterfaceTypeEnum().setValue(globalViewModel.getClockInterfaceTypeEnum().getValue()); + + } + }); } @@ -478,326 +542,24 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges themeUIContainer.setBackgroundColor(color); } - - StarFallAnimator starAnimator; - SkyAnimator skyAnimator; - RainAnimator rainAnimator; - SnowAnimator snowAnimator; - BubbleWhirlPoolAnimator bubbleWhirlPoolAnimator; - BubbleAnimator bubbleAnimator; - FluorescenceAnimator fluorescenceAnimator; - BubbleCollisionAnimator bubbleCollisionAnimator; - FireworkAnimator fireworkAnimator; - DotsLineAnimator dotsLineAnimator; - WaterAnimator waterAnimator; - FireAnimator fireAnimator; - SawtoothAnimator sawtoothAnimator; - WindmillAnimator windmillAnimator; - VorolayAnimator vorolayAnimator; - EZLedAnimator eZLedAnimator; - EvaporateTextAnimator evaporateTextAnimator; - PhaserBallAnimator phaserBallAnimator; - CarrouselAnimator carrouselAnimator; - Wave3DAnimator wave3DAnimator; - MagicLineAnimator magicLineAnimator; - public void changeBackGroundAnimator(int index){ - int foregroundColor=globalViewModel.getForegroundColor().getValue(); - switch(index){ - case 0: - if(starAnimator==null) { - starAnimator = new StarFallAnimator(); - starAnimator.init(animatorView.getContext(),animatorView); - starAnimator.setColor(foregroundColor); - } - backGroundAnimator=starAnimator; - backGroundAnimator.setRandColor(false); - break; - case 2: - if(phaserBallAnimator ==null) { - phaserBallAnimator = new PhaserBallAnimator(); - phaserBallAnimator.init(animatorView.getContext(),animatorView); - phaserBallAnimator.setColor(foregroundColor); - } - backGroundAnimator= phaserBallAnimator; - backGroundAnimator.setRandColor(true); - break; - case 20: - if(rainAnimator==null) { - rainAnimator = new RainAnimator(); - rainAnimator.init(animatorView.getContext(),animatorView); - rainAnimator.setColor(foregroundColor); - } - backGroundAnimator=rainAnimator; - backGroundAnimator.setRandColor(false); - break; - case 4: - if(snowAnimator==null) { - snowAnimator = new SnowAnimator(); - snowAnimator.init(animatorView.getContext(),animatorView); - snowAnimator.setColor(foregroundColor); - } - backGroundAnimator=snowAnimator; - backGroundAnimator.setRandColor(false); - break; - case 5: - if(starAnimator==null) { - starAnimator = new StarFallAnimator(); - starAnimator.init(animatorView.getContext(),animatorView); - starAnimator.setColor(foregroundColor); - } - backGroundAnimator=starAnimator; - backGroundAnimator.setRandColor(true); - break; - case 6: - if(skyAnimator==null) { - skyAnimator = new SkyAnimator(); - skyAnimator.init(animatorView.getContext(),animatorView); - skyAnimator.setColor(foregroundColor); - } - backGroundAnimator=skyAnimator; - backGroundAnimator.setRandColor(true); - break; - case 7: - if(rainAnimator==null) { - rainAnimator = new RainAnimator(); - rainAnimator.init(animatorView.getContext(),animatorView); - rainAnimator.setColor(foregroundColor); - } - backGroundAnimator=rainAnimator; - backGroundAnimator.setRandColor(true); - break; - case 8: - if(snowAnimator==null) { - snowAnimator = new SnowAnimator(); - snowAnimator.init(animatorView.getContext(),animatorView); - snowAnimator.setColor(foregroundColor); - } - backGroundAnimator=snowAnimator; - backGroundAnimator.setRandColor(true); - break; - case 9: - if(bubbleWhirlPoolAnimator ==null) { - bubbleWhirlPoolAnimator = new BubbleWhirlPoolAnimator(); - bubbleWhirlPoolAnimator.init(animatorView.getContext(),animatorView); - bubbleWhirlPoolAnimator.setColor(foregroundColor); - } - backGroundAnimator= bubbleWhirlPoolAnimator; - backGroundAnimator.setRandColor(false); - break; - case 10: - if(bubbleAnimator ==null) { - bubbleAnimator = new BubbleAnimator(); - bubbleAnimator.init(animatorView.getContext(),animatorView); - bubbleAnimator.setColor(foregroundColor); - } - backGroundAnimator= bubbleAnimator; - backGroundAnimator.setRandColor(false); - break; - case 11: - if(bubbleAnimator ==null) { - bubbleAnimator = new BubbleAnimator(); - bubbleAnimator.init(animatorView.getContext(),animatorView); - bubbleAnimator.setColor(foregroundColor); - } - backGroundAnimator= bubbleAnimator; - backGroundAnimator.setRandColor(true); - break; - case 12: - if(bubbleWhirlPoolAnimator ==null) { - bubbleWhirlPoolAnimator = new BubbleWhirlPoolAnimator(); - bubbleWhirlPoolAnimator.init(animatorView.getContext(),animatorView); - bubbleWhirlPoolAnimator.setColor(foregroundColor); - } - backGroundAnimator= bubbleWhirlPoolAnimator; - backGroundAnimator.setRandColor(true); - break; - case 13: - if(fluorescenceAnimator ==null) { - fluorescenceAnimator = new FluorescenceAnimator(); - fluorescenceAnimator.init(animatorView.getContext(),animatorView); - fluorescenceAnimator.setColor(foregroundColor); - } - backGroundAnimator= fluorescenceAnimator; - //backGroundAnimator.setRandColor(true); - break; - case 14: - if(bubbleCollisionAnimator ==null) { - bubbleCollisionAnimator = new BubbleCollisionAnimator(); - bubbleCollisionAnimator.init(animatorView.getContext(),animatorView); - bubbleCollisionAnimator.setColor(foregroundColor); - } - backGroundAnimator= bubbleCollisionAnimator; - backGroundAnimator.setRandColor(false); - break; - case 15: - if(fireworkAnimator ==null) { - fireworkAnimator = new FireworkAnimator(); - fireworkAnimator.init(animatorView.getContext(),animatorView); - fireworkAnimator.setColor(foregroundColor); - } - backGroundAnimator= fireworkAnimator; - backGroundAnimator.setRandColor(true); - break; - case 16: - if(bubbleCollisionAnimator ==null) { - bubbleCollisionAnimator = new BubbleCollisionAnimator(); - bubbleCollisionAnimator.init(animatorView.getContext(),animatorView); - bubbleCollisionAnimator.setColor(foregroundColor); - } - backGroundAnimator= bubbleCollisionAnimator; - backGroundAnimator.setRandColor(true); - break; - case 17: - if(fireworkAnimator ==null) { - fireworkAnimator = new FireworkAnimator(); - fireworkAnimator.init(animatorView.getContext(),animatorView); - fireworkAnimator.setColor(foregroundColor); - } - backGroundAnimator= fireworkAnimator; - backGroundAnimator.setRandColor(false); - break; - case 18: - if(dotsLineAnimator ==null) { - dotsLineAnimator = new DotsLineAnimator(); - dotsLineAnimator.init(animatorView.getContext(),animatorView); - dotsLineAnimator.setColor(foregroundColor); - } - backGroundAnimator= dotsLineAnimator; - backGroundAnimator.setRandColor(false); - break; - case 19: - if(dotsLineAnimator ==null) { - dotsLineAnimator = new DotsLineAnimator(); - dotsLineAnimator.init(animatorView.getContext(),animatorView); - dotsLineAnimator.setColor(foregroundColor); - } - backGroundAnimator= dotsLineAnimator; - backGroundAnimator.setRandColor(true); - break; - case 3: - if(waterAnimator ==null) { - waterAnimator = new WaterAnimator(); - waterAnimator.init(animatorView.getContext(),animatorView); - waterAnimator.setColor(foregroundColor); - } - backGroundAnimator= waterAnimator; - backGroundAnimator.setRandColor(true); - break; - case 21: - if(fireAnimator ==null) { - fireAnimator = new FireAnimator(); - fireAnimator.init(animatorView.getContext(),animatorView); - fireAnimator.setColor(foregroundColor); - } - backGroundAnimator= fireAnimator; - //backGroundAnimator.setRandColor(true); - break; - case 22: - if(skyAnimator==null) { - skyAnimator = new SkyAnimator(); - skyAnimator.init(animatorView.getContext(),animatorView); - skyAnimator.setColor(foregroundColor); - } - backGroundAnimator=skyAnimator; - backGroundAnimator.setRandColor(false); - break; - case 23: - if(sawtoothAnimator ==null) { - sawtoothAnimator = new SawtoothAnimator(); - sawtoothAnimator.init(animatorView.getContext(),animatorView); - sawtoothAnimator.setColor(foregroundColor); - } - backGroundAnimator= sawtoothAnimator; - backGroundAnimator.setRandColor(true); - break; - case 24: - if(windmillAnimator ==null) { - windmillAnimator = new WindmillAnimator(); - windmillAnimator.init(animatorView.getContext(),animatorView); - windmillAnimator.setColor(foregroundColor); - } - backGroundAnimator= windmillAnimator; - backGroundAnimator.setRandColor(true); - break; - case 25: - if(vorolayAnimator ==null) { - vorolayAnimator = new VorolayAnimator(); - vorolayAnimator.init(animatorView.getContext(),animatorView); - vorolayAnimator.setColor(foregroundColor); - } - backGroundAnimator= vorolayAnimator; - backGroundAnimator.setRandColor(true); - break; - case 26: - if(carrouselAnimator ==null) { - carrouselAnimator = new CarrouselAnimator(); - carrouselAnimator.init(animatorView.getContext(),animatorView); - carrouselAnimator.setColor(foregroundColor); - } - backGroundAnimator= carrouselAnimator; - backGroundAnimator.setRandColor(true); - break; - case 27: - if(wave3DAnimator ==null) { - wave3DAnimator = new Wave3DAnimator(); - wave3DAnimator.init(animatorView.getContext(),animatorView); - wave3DAnimator.setColor(foregroundColor); - } - backGroundAnimator= wave3DAnimator; - backGroundAnimator.setRandColor(true); - break; - case 28: - if(magicLineAnimator ==null) { - magicLineAnimator = new MagicLineAnimator(); - magicLineAnimator.init(animatorView.getContext(),animatorView); - magicLineAnimator.setColor(foregroundColor); - } - backGroundAnimator= magicLineAnimator; - backGroundAnimator.setRandColor(true); - break; - case 1: - if(magicLineAnimator ==null) { - magicLineAnimator = new MagicLineAnimator(); - magicLineAnimator.init(animatorView.getContext(),animatorView); - magicLineAnimator.setColor(foregroundColor); - } - backGroundAnimator= magicLineAnimator; - backGroundAnimator.setRandColor(false); - break; - - case 60: - if(evaporateTextAnimator ==null) { - evaporateTextAnimator = new EvaporateTextAnimator(); - evaporateTextAnimator.init(animatorView.getContext(),animatorView); - evaporateTextAnimator.setColor(foregroundColor); - } - backGroundAnimator= evaporateTextAnimator; - backGroundAnimator.setRandColor(true); - break; - - case 80://以下为特殊动画 - if(eZLedAnimator ==null) { - eZLedAnimator = new EZLedAnimator(); - eZLedAnimator.init(animatorView.getContext(),animatorView); - eZLedAnimator.setColor(foregroundColor); - } - backGroundAnimator= eZLedAnimator; - backGroundAnimator.setRandColor(true); - eZLedAnimator.setText(model.getDescription(),500); - break; - - default: - currectAnimatorIndex=0; - backGroundAnimator=null; + public void nextBackGroundAnimator(){ + boolean randomColor=globalViewModel.getBackgroundAnimatorRandomColor(); + if(!randomColor&&backGroundAnimator!=null) { + globalViewModel.setBackgroundAnimatorRandomColor(true); + backGroundAnimator.setRandColor(true); + animatorView.setAnimator(backGroundAnimator); + }else { + globalViewModel.setBackgroundAnimatorRandomColor(false); + globalViewModel.setBackgroundAnimatorName(animatorManager.next()); } - animatorView.setAnimator(backGroundAnimator); } public void changeBackGroundAnimator(String animatorName,boolean randomColor){ - currectAnimatorIndex=0; - backGroundAnimator= AnimatorFactory.build(animatorName); - if(backGroundAnimator!=null) + backGroundAnimator= animatorManager.configByName(animatorName); + if(backGroundAnimator!=null) { + backGroundAnimator.init(animatorView.getContext(),animatorView); backGroundAnimator.setRandColor(randomColor); + } animatorView.setAnimator(backGroundAnimator); } @@ -864,8 +626,12 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges @Override public void onLongPress(MotionEvent motionEvent) { + showConfigThemeUI(); + } + + private void changeThemeUI(){ if(!isPowerManagerDisable()) - localWakeLock.isHeld(); + localWakeLock.isHeld(); switch (globalViewModel.getClockInterfaceTypeEnum().getValue()){ case Digit: if(getCurrentThemeMode()== FULLSCREEN) @@ -927,7 +693,7 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges digitViewModel.setTimeFontStyle(fontManager.nextFont()); return true; } else if (e2.getX() - e1.getX() < -120) { // 从右向左滑动(右进左出) - changeBackGroundAnimator(currectAnimatorIndex++); + nextBackGroundAnimator(); return true; } return false; @@ -944,25 +710,30 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges @Override public boolean onDoubleTap(MotionEvent e) { + changeThemeUI(); + return true; + } + + + private void showConfigThemeUI(){ if(globalViewModel.getClockModeEnum().getValue()!=ClockModeEnum.NORMAL) - return false; + return ; switch (globalViewModel.getClockInterfaceTypeEnum().getValue()){ case Digit: if(!isShowAdvConfig) - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_config_container, new DigitClockConfigFragment()).addToBackStack(null).commit(); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_config_container, new DigitClockConfigFragment(themeUIManager)).addToBackStack(null).commit(); else getSupportFragmentManager().popBackStack(); isShowAdvConfig=!isShowAdvConfig; - break; + break; case Simulate: if(!isShowAdvConfig) - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_config_container, new SimulateClockConfigFragment()).addToBackStack(null).commit(); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_config_container, new SimulateClockConfigFragment(themeUIManager)).addToBackStack(null).commit(); else getSupportFragmentManager().popBackStack(); isShowAdvConfig=!isShowAdvConfig; break; } - return true; } @Override @@ -993,16 +764,10 @@ public class MainActivity extends AppCompatActivity implements android.view.Ges int step=new Float(span/30).intValue(); int maxFontSize=fontManager.getMaxFontSize(model.isDisplaySecond()); int currentFontSize=digitViewModel.getTimeFontStyleSize().getValue(); - //int currentFontSize=new Float(tv_time.getTextSize()/fontScale).intValue(); currentFontSize=currentFontSize+step; Log.d(TAG,"onScaleEnd span:"+span+"\t step:"+step+"\tcurrent text size"+currentFontSize+"\t max text size:"+maxFontSize+"\t"); - //if(currentFontSize>maxFontSize*1.3){ - // currentFontSize=maxFontSize; - //} - //if(currentFontSize() { - @Override - public void onChanged(String s) { - switchThemeType(s); - } - }); - - themeUIViewModel.getClockUITypeEnum().observe(mainActivity, new Observer() { - @Override - public void onChanged(ClockThemeUITypeEnum uiTypeEnum) { - switchMode(uiTypeEnum); - } - }); - - globalViewModel.getHourSystem12().observe(mainActivity, new Observer() { - @Override - public void onChanged(Boolean aBoolean) { - tv_hours_system.setVisibility(aBoolean ? View.VISIBLE : View.GONE); - } - }); - - globalViewModel.getTime_hour().observe(mainActivity, new Observer() { - @Override - public void onChanged(Integer integer) { - tv_hours_system.setImageResource(integer > 12 ? R.drawable.ic_pm : R.drawable.ic_am); - } - }); - - themeUIViewModel.getDescription().observe(mainActivity, new Observer() { - @Override - public void onChanged(String s) { - setDiscript(s); - } - }); - - globalViewModel.getForegroundColor().observe(mainActivity, new Observer() { - @Override - public void onChanged(Integer integer) { - setForegroundColor(integer); - } - }); - - globalViewModel.getHandUpAble().observe(mainActivity, new Observer() { - @Override - public void onChanged(Boolean handUpAbla) { - if(handUpAbla) { - tv_handup.setColorFilter(globalViewModel.getForegroundColor().getValue()); - tv_hand_time.setVisibility(View.VISIBLE); - }else{ - tv_handup.setColorFilter(R.color.colorPrimaryDark); - tv_hand_time.setVisibility(View.GONE); - if(clockStateMachine.getCurrentShowTimeType()== ClockTimeTypeEnum.COUNTING_DOWN) - clockStateMachine.setCurrentShowTimeType(ClockTimeTypeEnum.TIME); - } - } - }); - - globalViewModel.getHandUpTime().observe(mainActivity, new Observer() { - @Override - public void onChanged(Integer handUpTime) { - tv_hand_time.setText(DateModel.getTime(handUpTime)); - } - }); - - themeUIViewModel.getHand_time_visable().observe(mainActivity, new Observer() { - @Override - public void onChanged(Boolean aBoolean) { - tv_hand_time.setVisibility(aBoolean ? View.VISIBLE : View.GONE); - } - }); - - - themeUIViewModel.getWeatherDescription().observe(mainActivity, new Observer() { - @Override - public void onChanged(String s) { - tv_weather.setText(s); - } - }); - - - themeUIViewModel.getWeekDescription().observe(mainActivity, new Observer() { - @Override - public void onChanged(String s) { - tv_date.setText(s); - } - }); - - themeUIViewModel.getDayDescription().observe(mainActivity, new Observer() { - @Override - public void onChanged(String s) { - tv_day.setText(s); - } - }); - } - - int currentThemeTypeId = -1; - - private void switchThemeType(String themeType) { - switch (themeType) { - case "sample": - //themeBaseLine=-110; - currentThemeTypeId = R.layout.theme_sample; - break; - default: - //themeBaseLine=0; - currentThemeTypeId = R.layout.theme_default; - } - initTheme(mainActivity, currentThemeTypeId); - - setForegroundColor(globalViewModel.getForegroundColor().getValue()); - - setDiscriptForModel(); - - tv_weather.setText(themeUIViewModel.getWeatherDescription().getValue()); - - tv_date.setText(themeUIViewModel.getWeekDescription().getValue()); - - tv_day.setText(themeUIViewModel.getDayDescription().getValue()); - - updateHourSystem(); - - updateColorSettingButtunColor(); - - configThemeUITypeWithNoFullScreen(); - - autoFullScreenCheck(); - } - - - private void updateColorSettingButtunColor(){ - tv_foreground_color.setColorFilter(model.getForegroundColor()); - tv_foreground_color1.setColorFilter(model.getForegroundColor1()); - } - - private void initTheme(final Context context, int themeType) { - if (themeRootView != null) { - themeRootView.setVisibility(View.GONE); - themeUIContainer.removeView(themeRootView); - } - themeRootView = LayoutInflater.from(context).inflate(themeType, null, false); - themeUIContainer.addView(themeRootView); - - tv_background_image_hand = themeRootView.findViewById(R.id.tv_background_image_hand); - tv_background_image_hand.setOnClickListener(this); - tv_background_image_hand.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - mainActivity.configBackGroundImage(); - return true; - } - }); - - tv_date = themeRootView.findViewById(R.id.tv_date); - tv_date.setOnClickListener(this); - tv_date.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - if (currentThemeTypeId == R.layout.theme_default) - switchThemeType("sample"); - else - switchThemeType("default"); - return true; - } - }); - - tv_day = themeRootView.findViewById(R.id.tv_day); - tv_day.setOnClickListener(this); - tv_day.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - if (isScreenLock()) - return true; - model.setHourSystem12(!model.isHourSystem12()); - globalViewModel.setHourSystem12(model.isHourSystem12()); - if(model.isHourSystem12()) - globalViewModel.setTime_hour(globalViewModel.getTime_hour().getValue()); - return true; - } - }); - - tv_weather = themeRootView.findViewById(R.id.tv_weather); - tv_weather.setOnClickListener(this); - tv_descript = themeRootView.findViewById(R.id.tv_descript); - tv_descript.setOnClickListener(this); - tv_descript.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - //changeBackGroundAnimator(ANIMATOR_TEXTLED); - return true; - } - }); - - tv_break = themeRootView.findViewById(R.id.tv_break); - tv_break.setOnClickListener(this); - tv_break.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - clockStateMachine.handUpCountingDownCheck(); - return true; - } - }); - - tv_handup = themeRootView.findViewById(R.id.tv_hand); - tv_handup.setOnClickListener(this); - tv_handup.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View view) { - if (isScreenLock()) - return true; - setupHandUpTime(); - return true; - } - }); - tv_hand_time = themeRootView.findViewById(R.id.tv_hand_time); - tv_hand_time.setOnClickListener(this); - tv_hand_time.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - //hand_time_visable=false; - tv_hand_time.setVisibility(View.GONE); - return true; - } - }); - - tv_hours_system = themeRootView.findViewById(R.id.tv_hours_system); - - tv_background_color = themeRootView.findViewById(R.id.tv_background_color); - tv_background_color.setOnClickListener(this); - - tv_foreground_color = themeRootView.findViewById(R.id.tv_foreground_color); - tv_foreground_color.setOnClickListener(this); - tv_foreground_color.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - if (isScreenLock()) - return true; - if (colorPickerDialog == null) - colorPickerDialog = new ColorPickerPop(mainActivity); - - colorPickerDialog.setOnColorChangeListenter(new ColorPickerPop.OnColorListener() { - @Override - public void onEnsure(int color) { - model.setForegroundColor(color); - globalViewModel.setForegroundColor(color); - tv_foreground_color.setColorFilter(color); - autoFullScreenCheck(); - } - - @Override - public void onBack() { - } - }); - colorPickerDialog.show(model.getForegroundColor()); - return true; - } - }); - - tv_foreground_color1 = themeRootView.findViewById(R.id.tv_foreground_color1); - tv_foreground_color1.setOnClickListener(this); - tv_foreground_color1.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - if (isScreenLock()) - return true; - if (colorPickerDialog == null) - colorPickerDialog = new ColorPickerPop(mainActivity); - - colorPickerDialog.setOnColorChangeListenter(new ColorPickerPop.OnColorListener() { - @Override - public void onEnsure(int color) { - model.setForegroundColor1(color); - globalViewModel.setForegroundColor(color); - tv_foreground_color1.setColorFilter(color); - autoFullScreenCheck(); - } - - @Override - public void onBack() { - } - }); - colorPickerDialog.show(model.getForegroundColor1()); - return true; - } - }); - - tv_clock_interface = themeRootView.findViewById(R.id.tv_clock_interface); - tv_clock_interface.setOnClickListener(this); - - - tv_setting = themeRootView.findViewById(R.id.tv_setting); - tv_setting.setOnClickListener(this); - - - tv_screen_lock = themeRootView.findViewById(R.id.tv_screen_lock); - tv_screen_lock.setOnClickListener(this); - - tv_descript.init(mainActivity, false); - } - - private boolean isScreenLock() { - return globalViewModel.getSrceenLock().getValue(); - } - - private boolean isHandUpAble() { - return globalViewModel.getHandUpAble().getValue(); - } - - private void updateHourSystem() { - if (model.isHourSystem12()) - tv_hours_system.setVisibility(View.VISIBLE); - else - tv_hours_system.setVisibility(View.GONE); - } - - private void setupHandUpTime() { - int saveHandUpTime=model.getHandUpTime(); - int hour=0; - int minute=0; - if(handUpTimePopup==null) { - handUpTimePopup = new TimeSetupPopup(mainActivity); - handUpTimePopup.setOnSeekBarChangeListener(new TimeSetupPopup.OnTimeChangeListener() { - @Override - public void onChanged(int hour, int minute) { - if(hour==0&&minute==0) { - model.setHandUpTime(-1); - globalViewModel.setHandUpAble(false); - }else{ - model.setHandUpTime(hour*60+minute); - globalViewModel.setHandUpTime(hour*60+minute); - globalViewModel.setHandUpAble(true); - } - } - }); - } - if(saveHandUpTime>0){ - hour=saveHandUpTime/60; - minute=saveHandUpTime-hour*60; - } - handUpTimePopup.init(hour,minute); - handUpTimePopup.showPopupWindow(); - } - - private void setupTempHandUpTime() { - /*handUpAbla=false; - int hour=0; - int minute=0; - if(handUpTimePopup==null) { - handUpTimePopup = new TimeSetupPopup(this); - handUpTimePopup.setOnSeekBarChangeListener(new TimeSetupPopup.OnTimeChangeListener() { - @Override - public void onChanged(int hour, int minute) { - handUpTime=hour*60+minute; - } - }); - } - hour=handUpTime/60; - minute=handUpTime-hour*60; - handUpTimePopup.init(hour,minute); - handUpTimePopup.showPopupWindow(); - handUpAbla=true;*/ - } - - //Discript - private void setDiscript(String disp) { - tv_descript.setText(disp); - tv_descript.startScrollIfAble(); - } - - private void setDiscriptForModel() { - String dis = model.getDescription(); - if (dis == null || dis.isEmpty()) - dis = SettingActivity.roundFamousQuotes(); - setDiscript(dis); - } - - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - @Override - public void onClick(View view) { - if (isScreenLock() && view.getId() != R.id.tv_screen_lock && view.getId() != R.id.tv_handup_image) { - return; - } - switch (view.getId()) { - case R.id.tv_setting: - mainActivity.setup(); - break; - case R.id.tv_hand: - int handUpTime=model.getHandUpTime(); - boolean handUpAbla=isHandUpAble(); - if(!handUpAbla&&handUpTime<0) { - setupHandUpTime(); - }else{ - handUpAbla=!handUpAbla; - globalViewModel.setHandUpAble(handUpAbla); - } - break; - case R.id.tv_hand_time: - setupTempHandUpTime(); - break; - case R.id.tv_day: - digitViewModel.setDisplaySecond(!model.isDisplaySecond()); - break; - case R.id.tv_date: - if (calendarPopup == null) - calendarPopup = new CalendarPopup(mainActivity); - calendarPopup.showPopupWindow(); - calendarPopup.setCurrentDay(); - break; - case R.id.tv_weather: - if (weatherPopup == null) - weatherPopup = new WeatherPopup(mainActivity); - weatherPopup.init(mainActivity.weatherAdape.getWeatherList(), model.getCity() + " PM2.5 : " + mainActivity.weatherAdape.getmPM25()); - weatherPopup.showPopupWindow(); - break; - case R.id.tv_screen_lock: - globalViewModel.setSrceenLock(!isScreenLock()); - screenLock(!isScreenLock()); - break; - case R.id.tv_break: - clockStateMachine.countingCheck(); - break; - case R.id.tv_descript: - setDiscript(SettingActivity.roundAutoQuotes()); - break; - case R.id.tv_background_color: - if (colorPickerDialog == null) - colorPickerDialog = new ColorPickerPop(mainActivity); - - colorPickerDialog.setOnColorChangeListenter(new ColorPickerPop.OnColorListener() { - @Override - public void onEnsure(int color) { - globalViewModel.setBackgroundColor(color); - } - - @Override - public void onBack() { - } - }); - colorPickerDialog.show(model.getBackgroundColor()); - break; - case R.id.tv_background_image_hand: - if (globalViewModel.getBackgroundImageUri().getValue() == null) - mainActivity.configBackGroundImage(); - else - globalViewModel.setBackgroundImageVisable(!globalViewModel.getBackgroundImageVisable().getValue()); - break; - case R.id.tv_foreground_color: - globalViewModel.setForegroundColor(model.getForegroundColor()); - break; - case R.id.tv_foreground_color1: - globalViewModel.setForegroundColor(model.getForegroundColor1()); - break; - case R.id.tv_clock_interface: - changeClockInterface(); - break; - } - autoFullScreenCheck(); - } - - - protected void changeClockInterface() { - ClockInterfaceTypeEnum currentClockInterface = globalViewModel.getClockInterfaceTypeEnum().getValue(); - switch (currentClockInterface) { - case Digit: - currentClockInterface = ClockInterfaceTypeEnum.Simulate; - break; - default: - currentClockInterface = ClockInterfaceTypeEnum.Digit; - } - globalViewModel.setClockInterfaceTypeEnum(currentClockInterface); - } - - protected void setForegroundColor(Integer color) { - tv_date.setTextColor(color); - tv_day.setTextColor(color); - tv_weather.setTextColor(color); - tv_descript.setTextColor(color); - - tv_handup.setColorFilter(color); - tv_screen_lock.setColorFilter(color); - tv_setting.setColorFilter(color); - tv_background_color.setColorFilter(color); - tv_hand_time.setTextColor(color); - tv_hours_system.setColorFilter(color); - tv_background_image_hand.setColorFilter(color); - - tv_break.setColorFilter(color); - - tv_clock_interface.setColorFilter(color); - } - - - private void switchMode(ClockThemeUITypeEnum mode) { - Log.d(TAG, "switch mode to:" + mode); - switch (mode) { - case FULLSCREEN: - tv_date.setVisibility(View.GONE); - tv_day.setVisibility(View.GONE); - tv_weather.setVisibility(View.GONE); - tv_descript.setVisibility(View.GONE); - - tv_handup.setVisibility(View.GONE); - - tv_setting.setVisibility(View.GONE); - tv_background_color.setVisibility(View.GONE); - - tv_background_color.setVisibility(View.GONE); - tv_foreground_color.setVisibility(View.GONE); - tv_foreground_color1.setVisibility(View.GONE); - tv_background_image_hand.setVisibility(View.GONE); - - tv_break.setVisibility(View.GONE); - - tv_clock_interface.setVisibility(View.GONE); - - tv_screen_lock.setVisibility(View.GONE); - break; - case NORMAL: - tv_date.setVisibility(View.VISIBLE); - tv_day.setVisibility(View.VISIBLE); - tv_weather.setVisibility(View.VISIBLE); - tv_descript.setVisibility(View.VISIBLE); - - tv_handup.setVisibility(View.VISIBLE); - tv_break.setVisibility(View.VISIBLE); - - tv_setting.setVisibility(View.GONE); - tv_background_color.setVisibility(View.GONE); - tv_foreground_color.setVisibility(View.GONE); - tv_foreground_color1.setVisibility(View.GONE); - tv_background_image_hand.setVisibility(View.GONE); - - tv_clock_interface.setVisibility(View.GONE); - - tv_screen_lock.setVisibility(View.VISIBLE); - break; - case SETTING: - tv_date.setVisibility(View.VISIBLE); - tv_day.setVisibility(View.VISIBLE); - tv_weather.setVisibility(View.VISIBLE); - tv_descript.setVisibility(View.VISIBLE); - - tv_handup.setVisibility(View.VISIBLE); - tv_break.setVisibility(View.VISIBLE); - - tv_setting.setVisibility(View.VISIBLE); - tv_background_color.setVisibility(View.VISIBLE); - tv_foreground_color.setVisibility(View.VISIBLE); - tv_foreground_color1.setVisibility(View.VISIBLE); - tv_background_image_hand.setVisibility(View.VISIBLE); - - tv_clock_interface.setVisibility(View.VISIBLE); - - tv_screen_lock.setVisibility(View.VISIBLE); - break; + public void loadDigitThemeFromDB(String name) throws BasicException { + ThemeUI themeUI=findThemeUIFromDB(name,ClockInterfaceTypeEnum.Digit.code); + if(themeUI!=null) { + loadDigitTheme(themeUI.getConfigText()); } } - private boolean isFullScreen(){ - return themeUIViewModel.getClockUITypeEnum().getValue()==ClockThemeUITypeEnum.FULLSCREEN; + public void loadDigitTheme(String jsonString) throws BasicException { + DigitPerferenceModel digitPerferenceModel=new DigitPerferenceModel(); + JSONObject jsonObject = null; + try { + jsonObject = new JSONObject(jsonString); + digitPerferenceModel.fromJsonString(jsonObject); + model.themeUILoad(jsonObject); + model.setDigitPerferenceModel(digitPerferenceModel); + } catch (JSONException e) { + throw new BasicException(e); + } } - public void configThemeUITypeWithNoFullScreen(){ - if(globalViewModel.getClockInterfaceTypeEnum().getValue()==ClockInterfaceTypeEnum.Digit) - themeUIViewModel.setClockUITypeEnum(ClockThemeUITypeEnum.NORMAL); - else - themeUIViewModel.setClockUITypeEnum(ClockThemeUITypeEnum.SETTING); + public void loadSimulateThemeFromDB(String name)throws BasicException { + ThemeUI themeUI=findThemeUIFromDB(name,ClockInterfaceTypeEnum.Simulate.code); + if(themeUI!=null) { + loadSimulateTheme(themeUI.getConfigText()); + } } + public void loadSimulateTheme(String jsonString)throws BasicException { + SimulatePerferenceModel simulatePerferenceModel=new SimulatePerferenceModel(); + JSONObject jsonObject = null; + try { + jsonObject = new JSONObject(jsonString); + simulatePerferenceModel.fromJsonString(jsonObject); + model.themeUILoad(jsonObject); + model.setSimulatePerferenceModel(simulatePerferenceModel); + } catch (JSONException e) { + throw new BasicException(e); + } + } - public void screenLock(boolean locked) { - tv_screen_lock.setImageResource(locked ? R.drawable.ic_screen_lock : R.drawable.ic_screen_unlock); + public void saveDigitThemeFromModel(String name)throws BasicException { + ThemeUI themeUI=findThemeUIFromDB(name,ClockInterfaceTypeEnum.Digit.code); + if(themeUI==null){ + themeUI=new ThemeUI(); + themeUI.setName(name); + themeUI.setClockType(ClockInterfaceTypeEnum.Digit.code); + themeUI.setConfigText(makeSaveDigitThemeString(model.getDigitPerferenceModel())); + entityManager.insert(themeUI); + }else{ + themeUI.setConfigText(makeSaveDigitThemeString(model.getDigitPerferenceModel())); + entityManager.update(themeUI); + } + } + + public String makeSaveDigitThemeString(DigitPerferenceModel digitPerferenceModel){ + JSONObject jsonObject = new JSONObject(); + try { + digitPerferenceModel.toJsonString(jsonObject); + model.themeUISave(jsonObject); + } catch (JSONException e) { + e.printStackTrace(); + } + return jsonObject.toString(); + } + + public void saveSimulateThemeFromModel(String name)throws BasicException { + ThemeUI themeUI=findThemeUIFromDB(name,ClockInterfaceTypeEnum.Simulate.code); + if(themeUI==null){ + themeUI=new ThemeUI(); + themeUI.setName(name); + themeUI.setClockType(ClockInterfaceTypeEnum.Simulate.code); + themeUI.setConfigText(makeSaveSimulateThemeString(model.getSimulatePerferenceModel())); + entityManager.insert(themeUI); + }else{ + themeUI.setConfigText(makeSaveSimulateThemeString(model.getSimulatePerferenceModel())); + entityManager.update(themeUI); + } + } + + public String makeSaveSimulateThemeString(SimulatePerferenceModel simulatePerferenceModel){ + JSONObject jsonObject = new JSONObject(); + try { + simulatePerferenceModel.toJsonString(jsonObject); + model.themeUISave(jsonObject); + } catch (JSONException e) { + e.printStackTrace(); + } + return jsonObject.toString(); + } + + private ThemeUI findThemeUIFromDB(String name,int type)throws BasicException{ + ThemeUI themeUI=null; + if(!exitsThemeUIStyle(type,name)) + return null; + List themeUIList=entityManager.query(ThemeUI.class, QBF.c().eq(ThemeUI.NAME,name).eq(ThemeUI.CLOCK_TYPE, type).build()); + if(themeUIList.size()>0) + themeUI=themeUIList.get(0); + return themeUI; + } + + public boolean exitsThemeUIStyle(int type,String name)throws BasicException{ + return entityManager.isExistByFields(ThemeUI.class,new String[]{ThemeUI.NAME,ThemeUI.CLOCK_TYPE},new Object[]{name,type}); + } + + public String clobToString(Clob sc) throws SQLException, IOException { + String reString = ""; + Reader is = sc.getCharacterStream(); + BufferedReader br = new BufferedReader(is); + String s = br.readLine(); + StringBuffer sb = new StringBuffer(); + while (s != null) { + sb.append(s); + s = br.readLine(); + } + reString = sb.toString(); + return reString; } } diff --git a/app/src/main/java/clock/socoolby/com/clock/alter/AlterManager.java b/app/src/main/java/clock/socoolby/com/clock/alter/AlterManager.java index 4da1f8d..bded7ea 100644 --- a/app/src/main/java/clock/socoolby/com/clock/alter/AlterManager.java +++ b/app/src/main/java/clock/socoolby/com/clock/alter/AlterManager.java @@ -1,14 +1,22 @@ package clock.socoolby.com.clock.alter; import clock.socoolby.com.clock.model.DateModel; +import clock.socoolby.com.clock.viewmodel.GlobalViewModel; +import e.odbo.data.dao.EntityManager; public class AlterManager { DateModel startTime; DateModel stopTime; - public AlterManager(DateModel startTime, DateModel stopTime) { + GlobalViewModel globalViewModel; + + EntityManager entityManager; + + public AlterManager(DateModel startTime, DateModel stopTime,GlobalViewModel globalViewModel,EntityManager entityManager) { this.startTime = startTime; this.stopTime = stopTime; + this.globalViewModel=globalViewModel; + this.entityManager=entityManager; } public boolean isReport(int hour, int minute) { @@ -25,4 +33,5 @@ public class AlterManager { } return true; } + } diff --git a/app/src/main/java/clock/socoolby/com/clock/work/WorkRuleLoopType.java b/app/src/main/java/clock/socoolby/com/clock/alter/WorkRuleLoopType.java similarity index 82% rename from app/src/main/java/clock/socoolby/com/clock/work/WorkRuleLoopType.java rename to app/src/main/java/clock/socoolby/com/clock/alter/WorkRuleLoopType.java index bd55c15..527cca7 100644 --- a/app/src/main/java/clock/socoolby/com/clock/work/WorkRuleLoopType.java +++ b/app/src/main/java/clock/socoolby/com/clock/alter/WorkRuleLoopType.java @@ -1,4 +1,4 @@ -package clock.socoolby.com.clock.work; +package clock.socoolby.com.clock.alter; public enum WorkRuleLoopType { DateTime(0),EventDay(0xff),Mod(0x01),Tur(0x02); diff --git a/app/src/main/java/clock/socoolby/com/clock/dao/base/ThemeUI.java b/app/src/main/java/clock/socoolby/com/clock/dao/base/ThemeUI.java new file mode 100644 index 0000000..a3590e0 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/dao/base/ThemeUI.java @@ -0,0 +1,73 @@ +package clock.socoolby.com.clock.dao.base; + +import java.sql.Clob; + +import e.odbo.data.bean.AutoGeneratorStringKeyBean; + +public class ThemeUI extends AutoGeneratorStringKeyBean{ + +//private static final long serialVersionUID =-4172029310027187458L; + + public final static String ID="ID"; + public final static String NAME="NAME";//样式名称 + public final static String CLOCK_TYPE="CLOCK_TYPE";//数字0,模似1 + public final static String CONFIG_TEXT="CONFIG_TEXT";//jsons格式设置 + + protected String id; + protected String name; + protected Integer clockType; + protected String configText; + + public ThemeUI() { + super(); + } + + @Override + public String getKey() { + return id; + } + + @Override + public void setKey(String key) { + this.id=key; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getClockType() { + return clockType; + } + + public void setClockType(Integer clockType) { + this.clockType = clockType; + } + + public String getConfigText() { + return configText; + } + + public void setConfigText(String configText) { + this.configText = configText; + } + + public String toString() { + return "id="+id + +",name="+name + +",clockType="+clockType + +",configText="+configText; + } +} \ No newline at end of file diff --git a/app/src/main/java/clock/socoolby/com/clock/dao/base/ThemeUIDao.java b/app/src/main/java/clock/socoolby/com/clock/dao/base/ThemeUIDao.java new file mode 100644 index 0000000..fbe05dd --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/dao/base/ThemeUIDao.java @@ -0,0 +1,58 @@ +package clock.socoolby.com.clock.dao.base; + +import e.odbo.data.dao.BaseDAO; +import e.odbo.data.dao.table.TableDefinition; +import e.odbo.data.dao.table.Field; + +import com.openbravo.data.basic.BasicException; +import com.openbravo.data.loader.I_Session; +import com.openbravo.data.loader.serialize.Datas; +import e.odbo.data.format.Formats; +import com.openbravo.data.loader.serialize.DataWrite; +import com.openbravo.data.loader.serialize.DataRead; + + +public class ThemeUIDao extends BaseDAO { + + public ThemeUIDao(I_Session s) { + super(s); + } + + @Override + public Class getSuportClass() { + return ThemeUI.class; + } + + // tableDefinition table: theme_ui build time :2019-06-19 13:56:58.345 + + @Override + public TableDefinition getTable() { + TableDefinition theme_uiTableDefinition=new TableDefinition("theme_ui" ,new Field[]{ + new Field(ThemeUI.ID,Datas.STRING,Formats.STRING),//(PK) + new Field(ThemeUI.NAME,Datas.STRING,Formats.STRING),//(notNull) + new Field(ThemeUI.CLOCK_TYPE,Datas.INT,Formats.INT),//(notNull) + new Field(ThemeUI.CONFIG_TEXT,Datas.STRING,Formats.STRING)//(notNull) + }, new int[] {0} + ); + return theme_uiTableDefinition; + } + + @Override + public void writeInsertValues(DataWrite dp,ThemeUI obj) throws BasicException { + dp.setString(1,obj.getId()); + dp.setString(2,obj.getName()); + dp.setInteger(3,obj.getClockType()); + dp.setString(4,obj.getConfigText()); + } + + + public ThemeUI readValues(DataRead dr,ThemeUI obj) throws BasicException { + if(obj==null) + obj = new ThemeUI(); + obj.setId(dr.getString(1)); + obj.setName(dr.getString(2)); + obj.setClockType(dr.getInteger(3)); + obj.setConfigText(dr.getString(4)); + return obj; + } +} \ No newline at end of file diff --git a/app/src/main/java/clock/socoolby/com/clock/dao/base/TimeFontStyle.java b/app/src/main/java/clock/socoolby/com/clock/dao/base/TimeFontStyle.java index 2b1c7a1..90bdd61 100644 --- a/app/src/main/java/clock/socoolby/com/clock/dao/base/TimeFontStyle.java +++ b/app/src/main/java/clock/socoolby/com/clock/dao/base/TimeFontStyle.java @@ -1,27 +1,88 @@ package clock.socoolby.com.clock.dao.base; -public class TimeFontStyle { +import e.odbo.data.bean.BaseBean; + +public class TimeFontStyle extends BaseBean { + //private static final long serialVersionUID =-2865594038566020367L; + + public final static String NAME="NAME";//字体名称 + public final static String DISPLAY_SECOND="DISPLAY_SECOND";//有秒时的大小 + public final static String NO_DISPLAY_SECOND="NO_DISPLAY_SECOND";//无秒时的大小 + public final static String DISPLAY_SECOND_ON_FULL="DISPLAY_SECOND_ON_FULL";//全屏有秒时的大小 + public final static String NO_DISPLAY_SECOND_ON_FULL="NO_DISPLAY_SECOND_ON_FULL";//全屏无秒时的大小 + public String name; public int displaySecond; public int noDisplaySecond; public int displaySecondOnFull; public int noDisplaySecondOnFull; - public float secondScale; + + public TimeFontStyle() { + super(); + } public TimeFontStyle(String name, int displaySecond, int noDisplaySecond) { this(name,displaySecond,noDisplaySecond,displaySecond,noDisplaySecond); } public TimeFontStyle(String name, int displaySecond, int noDisplaySecond, int displaySecondOnFull, int noDisplaySecondOnFull) { - this(name,displaySecond,noDisplaySecond,displaySecondOnFull,noDisplaySecondOnFull,1/2); - } - - public TimeFontStyle(String name, int displaySecond, int noDisplaySecond, int displaySecondOnFull, int noDisplaySecondOnFull, float second) { this.name = name; this.displaySecond = displaySecond; this.noDisplaySecond = noDisplaySecond; this.displaySecondOnFull = displaySecondOnFull; this.noDisplaySecondOnFull = noDisplaySecondOnFull; - this.secondScale = second; + } + + @Override + public String getKey() { + return name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getDisplaySecond() { + return displaySecond; + } + + public void setDisplaySecond(Integer displaySecond) { + this.displaySecond = displaySecond; + } + + public Integer getNoDisplaySecond() { + return noDisplaySecond; + } + + public void setNoDisplaySecond(Integer noDisplaySecond) { + this.noDisplaySecond = noDisplaySecond; + } + + public Integer getDisplaySecondOnFull() { + return displaySecondOnFull; + } + + public void setDisplaySecondOnFull(Integer displaySecondOnFull) { + this.displaySecondOnFull = displaySecondOnFull; + } + + public Integer getNoDisplaySecondOnFull() { + return noDisplaySecondOnFull; + } + + public void setNoDisplaySecondOnFull(Integer noDisplaySecondOnFull) { + this.noDisplaySecondOnFull = noDisplaySecondOnFull; + } + + public String toString() { + return "name="+name + +",displaySecond="+displaySecond + +",noDisplaySecond="+noDisplaySecond + +",displaySecondOnFull="+displaySecondOnFull + +",noDisplaySecondOnFull="+noDisplaySecondOnFull; } } diff --git a/app/src/main/java/clock/socoolby/com/clock/dao/base/TimeFontStyleDao.java b/app/src/main/java/clock/socoolby/com/clock/dao/base/TimeFontStyleDao.java index 3a6b5fe..4eb6c26 100644 --- a/app/src/main/java/clock/socoolby/com/clock/dao/base/TimeFontStyleDao.java +++ b/app/src/main/java/clock/socoolby/com/clock/dao/base/TimeFontStyleDao.java @@ -1,4 +1,60 @@ package clock.socoolby.com.clock.dao.base; +import e.odbo.data.dao.BaseDAO; +import e.odbo.data.dao.table.TableDefinition; +import e.odbo.data.dao.table.Field; -public class TimeFontStyleDao { +import com.openbravo.data.basic.BasicException; +import com.openbravo.data.loader.I_Session; +import com.openbravo.data.loader.serialize.Datas; +import e.odbo.data.format.Formats; +import com.openbravo.data.loader.serialize.DataWrite; +import com.openbravo.data.loader.serialize.DataRead; + + +public class TimeFontStyleDao extends BaseDAO { + + public TimeFontStyleDao(I_Session s) { + super(s); + } + + @Override + public Class getSuportClass() { + return TimeFontStyle.class; + } + +// tableDefinition table: time_font_style build time :2019-06-16 15:01:08.154 + + @Override + public TableDefinition getTable() { + TableDefinition time_font_styleTableDefinition=new TableDefinition("time_font_style" ,new Field[]{ + new Field(TimeFontStyle.NAME,Datas.STRING,Formats.STRING),//(PK) + new Field(TimeFontStyle.DISPLAY_SECOND,Datas.INT,Formats.INT),//(notNull) + new Field(TimeFontStyle.NO_DISPLAY_SECOND,Datas.INT,Formats.INT),//(notNull) + new Field(TimeFontStyle.DISPLAY_SECOND_ON_FULL,Datas.INT,Formats.INT),//(notNull) + new Field(TimeFontStyle.NO_DISPLAY_SECOND_ON_FULL,Datas.INT,Formats.INT)//(notNull) + }, new int[] {0} + ); + return time_font_styleTableDefinition; + } + + @Override + public void writeInsertValues(DataWrite dp,TimeFontStyle obj) throws BasicException { + dp.setString(1,obj.getName()); + dp.setInt(2,obj.getDisplaySecond()); + dp.setInt(3,obj.getNoDisplaySecond()); + dp.setInt(4,obj.getDisplaySecondOnFull()); + dp.setInt(5,obj.getNoDisplaySecondOnFull()); + } + + + public TimeFontStyle readValues(DataRead dr,TimeFontStyle obj) throws BasicException { + if(obj==null) + obj = new TimeFontStyle(); + obj.setName(dr.getString(1)); + obj.setDisplaySecond(dr.getInt(2)); + obj.setNoDisplaySecond(dr.getInt(3)); + obj.setDisplaySecondOnFull(dr.getInt(4)); + obj.setNoDisplaySecondOnFull(dr.getInt(5)); + return obj; + } } diff --git a/app/src/main/java/clock/socoolby/com/clock/dao/base/UITheme.java b/app/src/main/java/clock/socoolby/com/clock/dao/base/UITheme.java deleted file mode 100644 index f82e277..0000000 --- a/app/src/main/java/clock/socoolby/com/clock/dao/base/UITheme.java +++ /dev/null @@ -1,6 +0,0 @@ -package clock.socoolby.com.clock.dao.base; - -public class UITheme { - String name; - String jsonString; -} diff --git a/app/src/main/java/clock/socoolby/com/clock/dao/base/UIThemeDao.java b/app/src/main/java/clock/socoolby/com/clock/dao/base/UIThemeDao.java deleted file mode 100644 index 73e40c9..0000000 --- a/app/src/main/java/clock/socoolby/com/clock/dao/base/UIThemeDao.java +++ /dev/null @@ -1,4 +0,0 @@ -package clock.socoolby.com.clock.dao.base; - -public class UIThemeDao { -} diff --git a/app/src/main/java/clock/socoolby/com/clock/db/WorkClockDatabase.java b/app/src/main/java/clock/socoolby/com/clock/db/WorkClockDatabase.java index 09c6e6a..7acea29 100644 --- a/app/src/main/java/clock/socoolby/com/clock/db/WorkClockDatabase.java +++ b/app/src/main/java/clock/socoolby/com/clock/db/WorkClockDatabase.java @@ -1,4 +1,88 @@ package clock.socoolby.com.clock.db; -public class WorkClockDatabase { +import clock.socoolby.com.clock.Constants; +import e.odbo.data.model.Column; +import e.odbo.data.model.ColumnType; +import e.odbo.data.model.DataBase; +import e.odbo.data.model.Table; +import e.odbo.data.model.TableData; +import e.odbo.data.model.smaple.PK; +import e.odbo.data.model.smaple.TimeLogAble; + +public class WorkClockDatabase extends DataBase { + public WorkClockDatabase() { + super(Constants.APP_NAME,"1.0.0"); + initTables(); + initDatas(); + } + + public Table fontStyle,themeUI,alter; + + private void initTables() { + fontStyle=new Table("time_font_style"); + fontStyle.addColumn( + Column.c("name", ColumnType.VARCHAR(30),"字体名称").PK(), + Column.c("display_second", ColumnType.INT,"有秒时的大小").NotNull(), + Column.c("no_display_second", ColumnType.INT,"无秒时的大小").NotNull(), + Column.c("display_second_on_full", ColumnType.INT,"全屏有秒时的大小").NotNull(), + Column.c("no_display_second_on_full", ColumnType.INT,"全屏无秒时的大小").NotNull() + ); + addTable(fontStyle); + + themeUI=new Table("theme_ui").implement(PK.PK_String); + themeUI.addColumn( + Column.c("name",ColumnType.VARCHAR(30),"样式名称").NotNull(), + Column.c("clock_type", ColumnType.INT,"数字0,模似1").NotNull(), + Column.c("config_text",ColumnType.VARCHAR(2000),"jsons格式设置").NotNull() + ); + addTable(themeUI); + + alter=new Table("alter").implement(PK.PK_UUID); + } + + private void initDatas() { + TableData fontStyleInitData = TableData.C(fontStyle.getName(),fontStyle.getColumnNames()).types(fontStyle.getColumnDatas()); + fontStyleInitData + .value("affair", 110, 120, 130, 150) + .value("agenda", 140, 150, 160, 180) + .value("cheapfire", 140, 150, 160, 180) + .value("cherif", 80, 100, 110, 140) + .value("Cigar Box Guitar", 120, 130, 140, 150) + .value("Ciung Wanara Sejati", 110, 120, 130, 150) + .value("DK Bergelmir", 120, 130, 140, 180) + .value("ds_digi", 140, 150, 160, 200) + .value("Funk", 110, 120, 130, 150) + .value("GLADYS Regular", 110, 120, 130, 150) + .value("Granite Rock St", 110, 120, 130, 170) + .value("GROOT", 120, 130, 140, 170) + .value("juleslove", 110, 120, 130, 150) + .value("Kingthings Annexx", 110, 120, 150, 180) + .value("Kingthings Willow", 110, 120, 130, 150) + .value("KYLE Regular", 110, 120, 130, 150) + .value("LCD-U", 130, 140, 150, 180) + .value("loong07龙书势如破竹简", 110, 120, 150, 170) + .value("MILKDROP", 110, 120, 130, 160) + .value("Mosaicleaf086", 110, 120, 130, 150) + .value("Pro Display tfb", 130, 140, 150, 170) + .value("SailingJunco", 130, 140, 150, 200) + .value("scoreboard", 120, 130, 140, 190) + .value("SFWasabi-Bold", 110, 120, 130, 140) + .value("Spaghettica", 110, 120, 130, 150) + .value("the_vandor_spot", 140, 150, 160, 210) + .value("Woodplank", 120, 130, 140, 180) + .value("Xtra Power", 100, 110, 120, 160) + .value("海报圆圆", 110, 120, 130, 150) + .value("爱心小兔", 110, 115, 130, 140) + .value("王漢宗海報體一半天水", 110, 120, 130, 150) + .value("立体铁山硬笔行楷简", 120, 130, 140, 180) + .value("腾祥倩心简", 110, 120, 130, 150) + .value("苏新诗毛糙体简", 110, 120, 130, 150) + .value("谁能许我扶桑花期", 110, 120, 130, 150) + .value("造字工房凌黑", 110, 120, 130, 150) + .value("中国龙新草体", 110, 120, 130, 150) + .value("迷你简剪纸_0",110,120,130,150); + addData(fontStyleInitData); + } + + } diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/AbstractThemeUIFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/AbstractThemeUIFragment.java index cb582e1..a32a65f 100644 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/AbstractThemeUIFragment.java +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/AbstractThemeUIFragment.java @@ -1,15 +1,16 @@ package clock.socoolby.com.clock.fragment; import android.annotation.TargetApi; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.TextView; +import android.widget.Toast; import androidx.fragment.app.Fragment; import androidx.lifecycle.Observer; @@ -26,12 +27,14 @@ import clock.socoolby.com.clock.model.DateModel; import clock.socoolby.com.clock.model.SharePerferenceModel; import clock.socoolby.com.clock.pop.CalendarPopup; import clock.socoolby.com.clock.pop.ColorPickerPop; +import clock.socoolby.com.clock.pop.TimeSetupMinPopup; import clock.socoolby.com.clock.pop.TimeSetupPopup; import clock.socoolby.com.clock.pop.WeatherPopup; import clock.socoolby.com.clock.state.ClockInterfaceTypeEnum; import clock.socoolby.com.clock.state.ClockStateMachine; import clock.socoolby.com.clock.state.ClockThemeUITypeEnum; import clock.socoolby.com.clock.state.ClockTimeTypeEnum; +import clock.socoolby.com.clock.viewmodel.AlterViewModel; import clock.socoolby.com.clock.viewmodel.DigitViewModel; import clock.socoolby.com.clock.viewmodel.GlobalViewModel; import clock.socoolby.com.clock.viewmodel.SimulateViewModel; @@ -60,15 +63,15 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O //颜色相关 private ImageButton tv_background_color; - private ImageButton tv_foreground_color; private ImageButton tv_foreground_color1; + private ImageButton tv_foreground_color2; private TextView tv_hand_time; //private boolean hand_time_visable=true; private ImageButton tv_screen_lock; ColorPickerPop colorPickerDialog; - TimeSetupPopup handUpTimePopup; + TimeSetupMinPopup handUpTimePopup; CalendarPopup calendarPopup; WeatherPopup weatherPopup; @@ -76,6 +79,7 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O DigitViewModel digitViewModel; SimulateViewModel simulateViewModel; ThemeUIViewModel themeUIViewModel; + AlterViewModel alterViewModel; MainActivity mainActivity; @@ -86,10 +90,11 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - this.globalViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(GlobalViewModel.class); - this.digitViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(DigitViewModel.class); - this.simulateViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(SimulateViewModel.class); - this.themeUIViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(ThemeUIViewModel.class); + this.globalViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(GlobalViewModel.class); + this.digitViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(DigitViewModel.class); + this.simulateViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(SimulateViewModel.class); + this.themeUIViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(ThemeUIViewModel.class); + this.alterViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(AlterViewModel.class); this.mainActivity = (MainActivity)getActivity(); this.model = ClockApplication.getInstance().getModel(); this.clockStateMachine=mainActivity.getClockStateMachine(); @@ -129,8 +134,6 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O return true; model.setHourSystem12(!model.isHourSystem12()); globalViewModel.setHourSystem12(model.isHourSystem12()); - if(model.isHourSystem12()) - globalViewModel.setTime_hour(globalViewModel.getTime_hour().getValue()); return true; } }); @@ -184,35 +187,7 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O tv_background_color = themeRootView.findViewById(R.id.tv_background_color); tv_background_color.setOnClickListener(this); - tv_foreground_color = themeRootView.findViewById(R.id.tv_foreground_color); - tv_foreground_color.setOnClickListener(this); - tv_foreground_color.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - if (isScreenLock()) - return true; - if (colorPickerDialog == null) - colorPickerDialog = new ColorPickerPop(getActivity()); - - colorPickerDialog.setOnColorChangeListenter(new ColorPickerPop.OnColorListener() { - @Override - public void onEnsure(int color) { - model.setForegroundColor(color); - globalViewModel.setForegroundColor(color); - tv_foreground_color.setColorFilter(color); - autoFullScreenCheck(); - } - - @Override - public void onBack() { - } - }); - colorPickerDialog.show(model.getForegroundColor()); - return true; - } - }); - - tv_foreground_color1 = themeRootView.findViewById(R.id.tv_foreground_color1); + tv_foreground_color1 = themeRootView.findViewById(R.id.tv_foreground_color); tv_foreground_color1.setOnClickListener(this); tv_foreground_color1.setOnLongClickListener(new View.OnLongClickListener() { @Override @@ -235,6 +210,34 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O public void onBack() { } }); + colorPickerDialog.show(model.getForegroundColor()); + return true; + } + }); + + tv_foreground_color2 = themeRootView.findViewById(R.id.tv_foreground_color1); + tv_foreground_color2.setOnClickListener(this); + tv_foreground_color2.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (isScreenLock()) + return true; + if (colorPickerDialog == null) + colorPickerDialog = new ColorPickerPop(getActivity()); + + colorPickerDialog.setOnColorChangeListenter(new ColorPickerPop.OnColorListener() { + @Override + public void onEnsure(int color) { + model.setForegroundColor2(color); + globalViewModel.setForegroundColor(color); + tv_foreground_color2.setColorFilter(color); + autoFullScreenCheck(); + } + + @Override + public void onBack() { + } + }); colorPickerDialog.show(model.getForegroundColor1()); return true; } @@ -251,7 +254,6 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O tv_screen_lock = themeRootView.findViewById(R.id.tv_screen_lock); tv_screen_lock.setOnClickListener(this); - //tv_descript.init(mainActivity, false); bindViewModel(); return themeRootView; } @@ -309,6 +311,8 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O @Override public void onChanged(Boolean aBoolean) { tv_hours_system.setVisibility(aBoolean ? View.VISIBLE : View.GONE); + if(aBoolean) + tv_hours_system.setImageResource(globalViewModel.getTime_hour().getValue() > 12 ? R.drawable.ic_pm : R.drawable.ic_am); } }); @@ -330,6 +334,7 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O @Override public void onChanged(Integer integer) { setForegroundColor(integer); + updateColorSettingButtunColor(); } }); @@ -388,8 +393,8 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O private void updateColorSettingButtunColor(){ - tv_foreground_color.setColorFilter(model.getForegroundColor()); tv_foreground_color1.setColorFilter(model.getForegroundColor1()); + tv_foreground_color2.setColorFilter(model.getForegroundColor2()); } private boolean isScreenLock() { @@ -407,22 +412,27 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O tv_hours_system.setVisibility(View.GONE); } + TimeSetupPopup handUpTimePopup1; + private void setupHandUpTime() { int saveHandUpTime=model.getHandUpTime(); int hour=0; int minute=0; - if(handUpTimePopup==null) { - handUpTimePopup = new TimeSetupPopup(mainActivity); - handUpTimePopup.setOnSeekBarChangeListener(new TimeSetupPopup.OnTimeChangeListener() { + if(handUpTimePopup1==null) { + handUpTimePopup1 = new TimeSetupPopup(mainActivity); + handUpTimePopup1.setOnSeekBarChangeListener(new TimeSetupPopup.OnTimeChangeListener() { @Override - public void onChanged(int hour, int minute) { - if(hour==0&&minute==0) { + public void onChanged(int hour, int minute, Uri uri, String s, String hundUpStyle) { + if (hour == 0 && minute == 0) { model.setHandUpTime(-1); globalViewModel.setHandUpAble(false); - }else{ - model.setHandUpTime(hour*60+minute); - globalViewModel.setHandUpTime(hour*60+minute); + } else { + model.setHandUpTime(hour * 60 + minute); + globalViewModel.setHandUpTime(hour * 60 + minute); globalViewModel.setHandUpAble(true); + globalViewModel.setHandUpTypeName(hundUpStyle); + alterViewModel.setHandUpMusic(uri); + alterViewModel.setHandUpMusicName(s); } } }); @@ -431,28 +441,28 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O hour=saveHandUpTime/60; minute=saveHandUpTime-hour*60; } - handUpTimePopup.init(hour,minute); - handUpTimePopup.showPopupWindow(); + handUpTimePopup1.init(hour,minute,globalViewModel.getHandUpTypeName().getValue(),alterViewModel.getHandUpMusic().getValue(),alterViewModel.getHandUpMusicName().getValue()); + handUpTimePopup1.showNow(getFragmentManager(),"test"); } private void setupTempHandUpTime() { - /*handUpAbla=false; + int saveHandUpTime=globalViewModel.getHandUpTime().getValue(); int hour=0; int minute=0; if(handUpTimePopup==null) { - handUpTimePopup = new TimeSetupPopup(this); - handUpTimePopup.setOnSeekBarChangeListener(new TimeSetupPopup.OnTimeChangeListener() { + handUpTimePopup = new TimeSetupMinPopup(mainActivity); + handUpTimePopup.setOnSeekBarChangeListener(new TimeSetupMinPopup.OnTimeChangeListener() { @Override public void onChanged(int hour, int minute) { - handUpTime=hour*60+minute; + globalViewModel.getHandUpTime().setValue(hour*60+minute); } }); } - hour=handUpTime/60; - minute=handUpTime-hour*60; + hour=saveHandUpTime/60; + minute=saveHandUpTime-hour*60; handUpTimePopup.init(hour,minute); handUpTimePopup.showPopupWindow(); - handUpAbla=true;*/ + } //Discript @@ -496,13 +506,17 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O break; case R.id.tv_date: if (calendarPopup == null) - calendarPopup = new CalendarPopup(mainActivity); - calendarPopup.showPopupWindow(); + calendarPopup = new CalendarPopup(mainActivity.getAlterManager()); + calendarPopup.showNow(getFragmentManager(),"test"); calendarPopup.setCurrentDay(); break; case R.id.tv_weather: if (weatherPopup == null) weatherPopup = new WeatherPopup(mainActivity); + if(mainActivity.weatherAdape==null) { + Toast.makeText(getActivity(),"天气数据获取失败,请检查网络",Toast.LENGTH_SHORT).show(); + return; + } weatherPopup.init(mainActivity.weatherAdape.getWeatherList(), model.getCity() + " PM2.5 : " + mainActivity.weatherAdape.getmPM25()); weatherPopup.showPopupWindow(); break; @@ -539,10 +553,10 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O globalViewModel.setBackgroundImageVisable(!globalViewModel.getBackgroundImageVisable().getValue()); break; case R.id.tv_foreground_color: - globalViewModel.setForegroundColor(model.getForegroundColor()); + globalViewModel.setForegroundColor(model.getForegroundColor1()); break; case R.id.tv_foreground_color1: - globalViewModel.setForegroundColor(model.getForegroundColor1()); + globalViewModel.setForegroundColor(model.getForegroundColor2()); break; case R.id.tv_clock_interface: changeClockInterface(); @@ -599,8 +613,8 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O tv_background_color.setVisibility(View.GONE); tv_background_color.setVisibility(View.GONE); - tv_foreground_color.setVisibility(View.GONE); tv_foreground_color1.setVisibility(View.GONE); + tv_foreground_color2.setVisibility(View.GONE); tv_background_image_hand.setVisibility(View.GONE); tv_break.setVisibility(View.GONE); @@ -620,8 +634,8 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O tv_setting.setVisibility(View.GONE); tv_background_color.setVisibility(View.GONE); - tv_foreground_color.setVisibility(View.GONE); tv_foreground_color1.setVisibility(View.GONE); + tv_foreground_color2.setVisibility(View.GONE); tv_background_image_hand.setVisibility(View.GONE); tv_clock_interface.setVisibility(View.GONE); @@ -639,8 +653,8 @@ public abstract class AbstractThemeUIFragment extends Fragment implements View.O tv_setting.setVisibility(View.VISIBLE); tv_background_color.setVisibility(View.VISIBLE); - tv_foreground_color.setVisibility(View.VISIBLE); tv_foreground_color1.setVisibility(View.VISIBLE); + tv_foreground_color2.setVisibility(View.VISIBLE); tv_background_image_hand.setVisibility(View.VISIBLE); tv_clock_interface.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/AlterFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/AlterFragment.java deleted file mode 100644 index 06b51fc..0000000 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/AlterFragment.java +++ /dev/null @@ -1,105 +0,0 @@ -package clock.socoolby.com.clock.fragment; - - -import android.os.Bundle; - -import androidx.fragment.app.Fragment; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProviders; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import clock.socoolby.com.clock.ClockApplication; -import clock.socoolby.com.clock.R; -import clock.socoolby.com.clock.state.ClockStateMachine; -import clock.socoolby.com.clock.utils.Player; -import clock.socoolby.com.clock.viewmodel.AlterViewModel; -import clock.socoolby.com.clock.viewmodel.GlobalViewModel; -import clock.socoolby.com.clock.viewmodel.ViewModelFactory; - -/** - * A simple {@link Fragment} subclass. - * Use the {@link AlterFragment} factory method to - * create an instance of this fragment. - */ -public class AlterFragment extends Fragment { - - GlobalViewModel globalViewModel; - AlterViewModel alterViewModel; - - ClockStateMachine clockStateMachine; - - private TextView tv_handup_text; - - private int handUPDialy=0; - - - public AlterFragment(ClockStateMachine clockStateMachine) { - this.clockStateMachine=clockStateMachine; - } - - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - globalViewModel= ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(GlobalViewModel.class); - alterViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(AlterViewModel.class); - } - - @Override - public void onResume() { - super.onResume(); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view=inflater.inflate(R.layout.fragment_alter, container, false); - tv_handup_text=view.findViewById(R.id.tv_handup_image); - tv_handup_text.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - endHandUp(true); - } - }); - bindViewModel(); - return view; - } - - private void bindViewModel(){ - alterViewModel.getHandUPDialy().observe(this, new Observer() { - @Override - public void onChanged(Integer integer) { - handUPDialy=integer; - } - }); - - globalViewModel.getHeartbeat().observe(this, new Observer() { - @Override - public void onChanged(Boolean aBoolean) { - handUPDialy--; - tv_handup_text.setText("hand up ! \t"+handUPDialy); - if(handUPDialy==0) - endHandUp(false); - else - Player.getInstance().playHandUp(ClockApplication.getContext()); - } - }); - - globalViewModel.getForegroundColor().observe(this, new Observer() { - @Override - public void onChanged(Integer integer) { - tv_handup_text.setTextColor(integer); - } - }); - } - - - private void endHandUp(boolean userCheck){ - clockStateMachine.stopHandUp(userCheck); - } - -} diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/DigitClockConfigFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockConfigFragment.java similarity index 78% rename from app/src/main/java/clock/socoolby/com/clock/fragment/DigitClockConfigFragment.java rename to app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockConfigFragment.java index dafa569..29b9770 100644 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/DigitClockConfigFragment.java +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockConfigFragment.java @@ -1,4 +1,4 @@ -package clock.socoolby.com.clock.fragment; +package clock.socoolby.com.clock.fragment.digit; import android.graphics.Color; import android.os.Bundle; @@ -11,16 +11,22 @@ import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; +import android.widget.Toast; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; +import com.openbravo.data.basic.BasicException; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import clock.socoolby.com.clock.ClockApplication; import clock.socoolby.com.clock.R; +import clock.socoolby.com.clock.ThemeUIManager; +import clock.socoolby.com.clock.fragment.simulate.SimulateClockFragment; import clock.socoolby.com.clock.pop.ColorPickerPop; +import clock.socoolby.com.clock.state.ClockInterfaceTypeEnum; import clock.socoolby.com.clock.viewmodel.DigitViewModel; import clock.socoolby.com.clock.viewmodel.GlobalViewModel; import clock.socoolby.com.clock.viewmodel.ViewModelFactory; @@ -36,6 +42,8 @@ public class DigitClockConfigFragment extends Fragment { DigitViewModel digitViewModel; GlobalViewModel globalViewModel; + ThemeUIManager themeUIManager; + @BindView(R.id.tv_hourSystem12) RadioButton tvHourSystem12; @BindView(R.id.tv_hourSystem24) @@ -92,15 +100,28 @@ public class DigitClockConfigFragment extends Fragment { TextView textView; @BindView(R.id.editText) TextView textView1; + @BindView(R.id.tv_themeUI_style_1) + Button tvThemeUIStyle1; + @BindView(R.id.tv_themeUI_style_2) + Button tvThemeUIStyle2; + @BindView(R.id.tv_themeUI_style_3) + Button tvThemeUIStyle3; + @BindView(R.id.tv_themeUI_style_4) + Button tvThemeUIStyle4; + @BindView(R.id.tv_textAnim_tabDigit_up) + RadioButton tvTextAnimTabDigitUp; + + public DigitClockConfigFragment(ThemeUIManager themeUIManager) { + this.themeUIManager = themeUIManager; + } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - globalViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(), ClockApplication.getInstance().getEntityManager())).get(GlobalViewModel.class); - digitViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(), ClockApplication.getInstance().getEntityManager())).get(DigitViewModel.class); + globalViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(GlobalViewModel.class); + digitViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(DigitViewModel.class); } - private Unbinder unbinder; private ColorPickerPop colorPickerDialog; @@ -171,6 +192,9 @@ public class DigitClockConfigFragment extends Fragment { case R.id.tv_textAnim_upflat: charAnimatorEnum = CharAnimatorEnum.Marquee3D_Up; break; + case R.id.tv_textAnim_tabDigit_up: + charAnimatorEnum = CharAnimatorEnum.TabDigit; + break; } if (charAnimatorEnum != CharAnimatorEnum.NOSETUP) if (digitViewModel.getDisplaySecond().getValue()) @@ -204,9 +228,50 @@ public class DigitClockConfigFragment extends Fragment { changeGradientColor(button8, 4); }); + tvThemeUIStyle1.setOnClickListener(v -> changeThemeUIStyle(1)); + + tvThemeUIStyle2.setOnClickListener(v -> changeThemeUIStyle(2)); + + tvThemeUIStyle3.setOnClickListener(v -> changeThemeUIStyle(3)); + + tvThemeUIStyle4.setOnClickListener(v -> changeThemeUIStyle(4)); + + tvThemeUIStyle1.setOnLongClickListener(v -> configThemeUIStyle(1)); + + tvThemeUIStyle2.setOnLongClickListener(v -> configThemeUIStyle(2)); + + tvThemeUIStyle3.setOnLongClickListener(v -> configThemeUIStyle(3)); + + tvThemeUIStyle4.setOnLongClickListener(v -> configThemeUIStyle(4)); + return view; } + private void changeThemeUIStyle(int order) { + String styleName = "digit_style_" + order; + try { + if (themeUIManager.exitsThemeUIStyle(ClockInterfaceTypeEnum.Digit.code, styleName)) { + themeUIManager.loadDigitThemeFromDB(styleName); + globalViewModel.loadFromModel(); + digitViewModel.loadFromModel(); + } else + Toast.makeText(getActivity(), "当前主题是空的,你可长按来保存一个主题", Toast.LENGTH_SHORT).show(); + } catch (BasicException e) { + e.printStackTrace(); + } + } + + private boolean configThemeUIStyle(int order) { + String styleName = "digit_style_" + order; + try { + themeUIManager.saveDigitThemeFromModel(styleName); + Toast.makeText(getActivity(), "当前主题已保存", Toast.LENGTH_SHORT).show(); + } catch (BasicException e) { + e.printStackTrace(); + } + return true; + } + private void changeGradientColor(Button view, int order) { if (colorPickerDialog == null) colorPickerDialog = new ColorPickerPop(getActivity()); @@ -281,6 +346,9 @@ public class DigitClockConfigFragment extends Fragment { case Marquee3D_Up: tvTextAnimUpflat.setChecked(true); break; + case TabDigit: + tvTextAnimTabDigitUp.setChecked(true); + break; } textView2.setChecked(digitViewModel.getLinearGradientAble().getValue()); @@ -305,14 +373,12 @@ public class DigitClockConfigFragment extends Fragment { button8.setClickable(able); }); - setTextColor(globalViewModel.getForegroundColor().getValue()); } private void setTextColor(int color) { tvHourSystem12.setTextColor(color); - tvHourSystem24.setTextColor(color); tvSecoundShow.setTextColor(color); @@ -320,23 +386,16 @@ public class DigitClockConfigFragment extends Fragment { textView3.setTextColor(color); tvTextStyleNumal.setTextColor(color); - tvTextStyleShadow.setTextColor(color); - tvTextStyleRelief.setTextColor(color); - tvTextStyleReflect.setTextColor(color); - tvTextAnimDown.setTextColor(color); - tvTextAnimUp.setTextColor(color); - tvTextAnimDownflit.setTextColor(color); - tvTextAnimUpflat.setTextColor(color); - tvTextAnimNumal.setTextColor(color); + tvTextAnimTabDigitUp.setTextColor(color); textView2.setTextColor(color); textView1.setTextColor(color); @@ -348,5 +407,9 @@ public class DigitClockConfigFragment extends Fragment { button7.setTextColor(color); button8.setTextColor(color); + tvThemeUIStyle1.setTextColor(color); + tvThemeUIStyle2.setTextColor(color); + tvThemeUIStyle3.setTextColor(color); + tvThemeUIStyle4.setTextColor(color); } } diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/DigitClockFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockFragment.java similarity index 94% rename from app/src/main/java/clock/socoolby/com/clock/fragment/DigitClockFragment.java rename to app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockFragment.java index 4f72054..c853a8e 100644 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/DigitClockFragment.java +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/digit/DigitClockFragment.java @@ -1,4 +1,4 @@ -package clock.socoolby.com.clock.fragment; +package clock.socoolby.com.clock.fragment.digit; import android.os.Bundle; @@ -41,8 +41,8 @@ public class DigitClockFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - digitViewModel= ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(DigitViewModel.class); - globalViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(GlobalViewModel.class); + digitViewModel= ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(DigitViewModel.class); + globalViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(GlobalViewModel.class); } @Override diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AbstractHandUpFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AbstractHandUpFragment.java new file mode 100644 index 0000000..d74c0aa --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AbstractHandUpFragment.java @@ -0,0 +1,77 @@ +package clock.socoolby.com.clock.fragment.handup; + +import android.net.Uri; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; + +import clock.socoolby.com.clock.ClockApplication; +import clock.socoolby.com.clock.state.ClockStateMachine; +import clock.socoolby.com.clock.utils.Player; +import clock.socoolby.com.clock.viewmodel.AlterViewModel; +import clock.socoolby.com.clock.viewmodel.GlobalViewModel; +import clock.socoolby.com.clock.viewmodel.ViewModelFactory; + +public abstract class AbstractHandUpFragment extends Fragment { + + GlobalViewModel globalViewModel; + AlterViewModel alterViewModel; + + ClockStateMachine clockStateMachine; + + int view_id; + + + public AbstractHandUpFragment(ClockStateMachine clockStateMachine, int view_id) { + this.clockStateMachine=clockStateMachine; + this.view_id=view_id; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + globalViewModel= ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(GlobalViewModel.class); + alterViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(AlterViewModel.class); + } + + @Override + public void onResume() { + super.onResume(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view=inflater.inflate(view_id, container, false); + bindView(view); + bindViewModel(); + return view; + } + + abstract void bindView(View rootView); + + + abstract void bindViewModel(); + + + protected void endHandUp(boolean userCheck){ + clockStateMachine.stopHandUp(userCheck); + Player.getInstance().resert(); + } + + + protected void playHandUpMusic(){ + Uri musicUri=alterViewModel.getHandUpMusic().getValue(); + if(musicUri==null) { + Player.getInstance().playHandUp(ClockApplication.getContext()); + return; + } + + Player.getInstance().playRing(ClockApplication.getContext(),musicUri); + } + +} diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AbstractHandUpSelectFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AbstractHandUpSelectFragment.java new file mode 100644 index 0000000..ef263ac --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AbstractHandUpSelectFragment.java @@ -0,0 +1,15 @@ +package clock.socoolby.com.clock.fragment.handup; + +import clock.socoolby.com.clock.state.ClockStateMachine; + +public abstract class AbstractHandUpSelectFragment extends AbstractHandUpFragment { + + + public AbstractHandUpSelectFragment(ClockStateMachine clockStateMachine, int view_id) { + super(clockStateMachine, view_id); + } + + protected void selected(){ + this.endHandUp(true); + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AlterFragmentFactory.java b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AlterFragmentFactory.java new file mode 100644 index 0000000..3441958 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/AlterFragmentFactory.java @@ -0,0 +1,15 @@ +package clock.socoolby.com.clock.fragment.handup; + +import clock.socoolby.com.clock.state.ClockStateMachine; + +public final class AlterFragmentFactory { + + public static AbstractHandUpFragment build(String name, ClockStateMachine clockStateMachine){ + switch (name){ + case HandUpSelect123Fragment.NAME: + return new HandUpSelect123Fragment(clockStateMachine); + + } + return new HandUpDefaultFragment(clockStateMachine); + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/handup/HandUpDefaultFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/HandUpDefaultFragment.java new file mode 100644 index 0000000..e0af8eb --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/HandUpDefaultFragment.java @@ -0,0 +1,68 @@ +package clock.socoolby.com.clock.fragment.handup; + + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import android.view.View; +import android.widget.TextView; + +import clock.socoolby.com.clock.R; +import clock.socoolby.com.clock.state.ClockStateMachine; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link HandUpDefaultFragment} factory method to + * create an instance of this fragment. + */ +public class HandUpDefaultFragment extends AbstractHandUpFragment { + + public static final String NAME="default"; + + private TextView tv_handup_text; + + private int handUPDialy=0; + + + public HandUpDefaultFragment(ClockStateMachine clockStateMachine) { + super(clockStateMachine,R.layout.fragment_alter); + } + + @Override + void bindView(View rootView) { + tv_handup_text=rootView.findViewById(R.id.tv_handup_image); + tv_handup_text.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + endHandUp(true); + } + }); + } + + void bindViewModel(){ + alterViewModel.getHandUPDialy().observe(this, new Observer() { + @Override + public void onChanged(Integer integer) { + handUPDialy=integer; + } + }); + + globalViewModel.getHeartbeat().observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + handUPDialy--; + tv_handup_text.setText("hand up ! \t"+handUPDialy); + if(handUPDialy==0) + endHandUp(false); + else + playHandUpMusic(); + } + }); + + globalViewModel.getForegroundColor().observe(this, new Observer() { + @Override + public void onChanged(Integer integer) { + tv_handup_text.setTextColor(integer); + } + }); + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/handup/HandUpSelect123Fragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/HandUpSelect123Fragment.java new file mode 100644 index 0000000..bf28720 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/handup/HandUpSelect123Fragment.java @@ -0,0 +1,119 @@ +package clock.socoolby.com.clock.fragment.handup; + +import android.graphics.Color; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; +import androidx.lifecycle.Observer; +import java.util.Random; +import clock.socoolby.com.clock.R; +import clock.socoolby.com.clock.state.ClockStateMachine; + +public class HandUpSelect123Fragment extends AbstractHandUpSelectFragment implements View.OnClickListener { + + public static final String NAME="alter_select_123"; + + Button selectButton1,selectButton2,selectButton3; + + int rundomButton; + + int roundLoop=5; + + public HandUpSelect123Fragment(ClockStateMachine clockStateMachine) { + super(clockStateMachine, R.layout.fragment_alter_select_123); + + heartBeatObserver=new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if(roundLoop==0) { + globalViewModel.getHeartbeat().removeObserver(this); + setButtonColor(rundomButton); + roundLoop=5; + }else + setButtonColor(random.nextInt(3)); + roundLoop--; + } + }; + } + + @Override + void bindView(View rootView) { + selectButton1=rootView.findViewById(R.id.tv_select_button1); + selectButton1.setOnClickListener(this); + selectButton2=rootView.findViewById(R.id.tv_select_button2); + selectButton2.setOnClickListener(this); + selectButton3=rootView.findViewById(R.id.tv_select_button3); + selectButton3.setOnClickListener(this); + + } + + Random random=new Random(); + int foregroundColor; + + Observer heartBeatObserver; + + @Override + void bindViewModel() { + foregroundColor=globalViewModel.getForegroundColor().getValue(); + + rundomButton=random.nextInt(3); + switch (rundomButton) { + case 0: + selectButton1.setText("是我啦"); + break; + case 1: + selectButton2.setText("是我啦"); + break; + case 2: + selectButton3.setText("是我啦"); + break; + } + } + + @Override + public void onResume() { + super.onResume(); + globalViewModel.getHeartbeat().observe(getActivity(),heartBeatObserver); + } + + private void setButtonColor(int index){ + switch (index){ + case 0: + selectButton1.setBackgroundColor(Color.RED); + selectButton2.setBackgroundColor(foregroundColor); + selectButton3.setBackgroundColor(foregroundColor); + break; + case 1: + selectButton1.setBackgroundColor(foregroundColor); + selectButton2.setBackgroundColor(Color.RED); + selectButton3.setBackgroundColor(foregroundColor); + break; + case 2: + selectButton1.setBackgroundColor(foregroundColor); + selectButton2.setBackgroundColor(foregroundColor); + selectButton3.setBackgroundColor(Color.RED); + break; + } + } + + + @Override + public void onClick(View v) { + int selectIndex=0; + switch (v.getId()){ + case R.id.tv_select_button1: + selectIndex=0; + break; + case R.id.tv_select_button2: + selectIndex=1; + break; + case R.id.tv_select_button3: + selectIndex=2; + break; + } + if(selectIndex==rundomButton) + selected(); + else + Toast.makeText(getActivity(),"请选择红色",Toast.LENGTH_SHORT).show(); + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/houranimator/HourAnimatorFactory.java b/app/src/main/java/clock/socoolby/com/clock/fragment/houranimator/HourAnimatorFactory.java new file mode 100644 index 0000000..df6c574 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/houranimator/HourAnimatorFactory.java @@ -0,0 +1,26 @@ +package clock.socoolby.com.clock.fragment.houranimator; + +import clock.socoolby.com.clock.widget.animatorview.I_Animator; +import clock.socoolby.com.clock.widget.animatorview.animator.FerrisWheelAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.FishAnimator; +import clock.socoolby.com.clock.widget.animatorview.animator.WindmillAnimator; + +public final class HourAnimatorFactory { + public static boolean isHourAnimator(String typeName){ + return !"default".equalsIgnoreCase(typeName); + } + + public static HourAnimatorFragment builder(String typeName,int hour){ + I_Animator animator=null; + switch (typeName){ + case FerrisWheelAnimator.NAME: + break; + case FishAnimator.NAME: + animator=new FishAnimator(hour>12?hour-12:hour); + break; + default: + animator=new WindmillAnimator(hour>12?hour-12:hour); + } + return new HourAnimatorFragment(animator); + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/houranimator/HourAnimatorFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/houranimator/HourAnimatorFragment.java new file mode 100644 index 0000000..ce70681 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/houranimator/HourAnimatorFragment.java @@ -0,0 +1,99 @@ +package clock.socoolby.com.clock.fragment.houranimator; + + +import android.os.Bundle; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import clock.socoolby.com.clock.ClockApplication; +import clock.socoolby.com.clock.R; +import clock.socoolby.com.clock.viewmodel.GlobalViewModel; +import clock.socoolby.com.clock.viewmodel.ViewModelFactory; +import clock.socoolby.com.clock.widget.animatorview.AnimatorView; +import clock.socoolby.com.clock.widget.animatorview.I_Animator; + +/** + * A simple {@link Fragment} subclass. + */ +public class HourAnimatorFragment extends Fragment { + + GlobalViewModel globalViewModel; + + AnimatorView animatorView; + + private int animatorDialy; + + I_Animator hourAnimator; + + Observer heartbeatObserver; + + public HourAnimatorFragment(I_Animator hourAnimator) { + this.hourAnimator=hourAnimator; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + globalViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(GlobalViewModel.class); + + heartbeatObserver=new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + Log.d("hour Animator", "go in heartBeat Observer:"+animatorDialy); + animatorDialy--; + if(animatorDialy==0) { + Log.d("hour Animator", "animator dialy is out ,end animator"); + globalViewModel.setTimeHourAnimatorStarting(false); + animatorDialy=globalViewModel.getTimeHourAnimatordialy().getValue(); + } + } + }; + + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view=inflater.inflate(R.layout.fragment_hour_animator, container, false); + animatorView=view.findViewById(R.id.tv_hour_animatorview); + bindViewModel(); + Log.d("hourAnimator fragment","on create animator view width:"+animatorView.getWidth()); + hourAnimator.init(getActivity(),animatorView); + animatorView.setAnimator(hourAnimator); + return view; + } + + + @Override + public void onResume() { + super.onResume(); + globalViewModel.getHeartbeat().observe(getActivity(),heartbeatObserver); + animatorView.start(); + } + + + @Override + public void onPause() { + super.onPause(); + globalViewModel.getHeartbeat().removeObserver(heartbeatObserver); + animatorView.pause(); + } + + private void bindViewModel(){ + animatorDialy=globalViewModel.getTimeHourAnimatordialy().getValue(); + + globalViewModel.getForegroundColor().observe(getActivity(), new Observer() { + @Override + public void onChanged(Integer integer) { + animatorView.setColor(integer); + } + }); + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/SimulateClockConfigFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/simulate/SimulateClockConfigFragment.java similarity index 68% rename from app/src/main/java/clock/socoolby/com/clock/fragment/SimulateClockConfigFragment.java rename to app/src/main/java/clock/socoolby/com/clock/fragment/simulate/SimulateClockConfigFragment.java index 8827bde..4b495e5 100644 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/SimulateClockConfigFragment.java +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/simulate/SimulateClockConfigFragment.java @@ -1,4 +1,4 @@ -package clock.socoolby.com.clock.fragment; +package clock.socoolby.com.clock.fragment.simulate; import android.os.Bundle; import android.view.LayoutInflater; @@ -9,16 +9,21 @@ import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.ScrollView; import android.widget.TextView; +import android.widget.Toast; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; +import com.openbravo.data.basic.BasicException; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import clock.socoolby.com.clock.ClockApplication; import clock.socoolby.com.clock.R; +import clock.socoolby.com.clock.ThemeUIManager; import clock.socoolby.com.clock.pop.ColorPickerPop; +import clock.socoolby.com.clock.state.ClockInterfaceTypeEnum; import clock.socoolby.com.clock.viewmodel.GlobalViewModel; import clock.socoolby.com.clock.viewmodel.SimulateViewModel; import clock.socoolby.com.clock.viewmodel.ViewModelFactory; @@ -36,6 +41,8 @@ public class SimulateClockConfigFragment extends Fragment { public static final String NAME = "simulateClockConfig"; + ThemeUIManager themeUIManager; + SimulateViewModel simulateViewModel; GlobalViewModel globalViewModel; @BindView(R.id.tv_simulate_color_pointer) @@ -78,16 +85,28 @@ public class SimulateClockConfigFragment extends Fragment { Button tvSimulatePointerStyle6; @BindView(R.id.tv_simulate_color_pointer_second) Button tvSimulateColorPointerSecond; + @BindView(R.id.tv_themeUI_style_1) + Button tvThemeUIStyle1; + @BindView(R.id.tv_themeUI_style_2) + Button tvThemeUIStyle2; + @BindView(R.id.tv_themeUI_style_3) + Button tvThemeUIStyle3; + @BindView(R.id.tv_themeUI_style_4) + Button tvThemeUIStyle4; private Unbinder unbinder; private ColorPickerPop colorPickerDialog; + public SimulateClockConfigFragment(ThemeUIManager themeUIManager) { + this.themeUIManager = themeUIManager; + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - globalViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(), ClockApplication.getInstance().getEntityManager())).get(GlobalViewModel.class); - simulateViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(), ClockApplication.getInstance().getEntityManager())).get(SimulateViewModel.class); + globalViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(GlobalViewModel.class); + simulateViewModel = ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(SimulateViewModel.class); } @Override @@ -213,10 +232,53 @@ public class SimulateClockConfigFragment extends Fragment { }); }); + tvThemeUIStyle1.setOnClickListener(v->changeThemeUIStyle(1)); + + tvThemeUIStyle2.setOnClickListener(v->changeThemeUIStyle(2)); + + tvThemeUIStyle3.setOnClickListener(v->changeThemeUIStyle(3)); + + tvThemeUIStyle4.setOnClickListener(v->changeThemeUIStyle(4)); + + tvThemeUIStyle1.setOnLongClickListener(v->configThemeUIStyle(1)); + + tvThemeUIStyle2.setOnLongClickListener(v->configThemeUIStyle(2)); + + tvThemeUIStyle3.setOnLongClickListener(v->configThemeUIStyle(3)); + + tvThemeUIStyle4.setOnLongClickListener(v->configThemeUIStyle(4)); + + return view; } - private void colorSelect(int defColor, ColorPickerPop.OnColorListener listener){ + private void changeThemeUIStyle(int order){ + String styleName="simulate_style_"+order; + try { + if(themeUIManager.exitsThemeUIStyle(ClockInterfaceTypeEnum.Simulate.code,styleName)){ + themeUIManager.loadSimulateThemeFromDB(styleName); + globalViewModel.loadFromModel(); + simulateViewModel.loadFromModel(); + }else + Toast.makeText(getActivity(),"当前主题是空的,你可长按来保存一个主题",Toast.LENGTH_SHORT).show(); + } catch (BasicException e) { + e.printStackTrace(); + } + } + + private boolean configThemeUIStyle(int order){ + String styleName="simulate_style_"+order; + try { + themeUIManager.saveSimulateThemeFromModel(styleName); + Toast.makeText(getActivity(),"当前主题已保存",Toast.LENGTH_SHORT).show(); + } catch (BasicException e) { + e.printStackTrace(); + } + return true; + } + + + private void colorSelect(int defColor, ColorPickerPop.OnColorListener listener) { if (colorPickerDialog == null) colorPickerDialog = new ColorPickerPop(getActivity()); colorPickerDialog.setOnColorChangeListenter(listener); @@ -225,7 +287,7 @@ public class SimulateClockConfigFragment extends Fragment { private void bindViewModel() { - + globalViewModel.getForegroundColor().observe(this,integer -> setTextColor(integer)); } /** @@ -236,4 +298,41 @@ public class SimulateClockConfigFragment extends Fragment { super.onDestroyView(); unbinder.unbind(); } + + private void setTextColor(int color) { + + tvSimulateColorPointer.setBackgroundColor(simulateViewModel.getSimulateClockColorPointer().getValue()); + tvSimulateColorPointerSecond.setBackgroundColor(simulateViewModel.getSimulateClockColorPointerSecond().getValue()); + tvSimulateColorScale.setBackgroundColor(simulateViewModel.getSimulateClockColorScale().getValue()); + tvSimulateColorScalepParticularly.setBackgroundColor(simulateViewModel.getSimulateClockColorScaleParticularly().getValue()); + tvSimulateColorOutline.setBackgroundColor(simulateViewModel.getSimulateClockColorOutLine().getValue()); + tvSimulateColorText.setBackgroundColor(simulateViewModel.getSimulateClockColorText().getValue()); + + tvSimulateColorPointer.setTextColor(color); + tvSimulateColorPointerSecond.setTextColor(color); + tvSimulateColorScale.setTextColor(color); + tvSimulateColorScalepParticularly.setTextColor(color); + tvSimulateColorOutline.setTextColor(color); + tvSimulateColorText.setTextColor(color); + + tvThemeUIStyle1.setTextColor(color); + tvThemeUIStyle2.setTextColor(color); + tvThemeUIStyle3.setTextColor(color); + tvThemeUIStyle4.setTextColor(color); + + tvSimulatePointerStyle0.setTextColor(color); + tvSimulatePointerStyle1.setTextColor(color); + tvSimulatePointerStyle2.setTextColor(color); + tvSimulatePointerStyle3.setTextColor(color); + tvSimulatePointerStyle4.setTextColor(color); + tvSimulatePointerStyle5.setTextColor(color); + tvSimulatePointerStyle6.setTextColor(color); + + textView4.setTextColor(color); + textView5.setTextColor(color); + + tvSimulateTextShowHide.setTextColor(color); + tvSimulateTextShowAll.setTextColor(color); + tvSimulateTextShowFour.setTextColor(color); + } } diff --git a/app/src/main/java/clock/socoolby/com/clock/fragment/SimulateClockFragment.java b/app/src/main/java/clock/socoolby/com/clock/fragment/simulate/SimulateClockFragment.java similarity index 77% rename from app/src/main/java/clock/socoolby/com/clock/fragment/SimulateClockFragment.java rename to app/src/main/java/clock/socoolby/com/clock/fragment/simulate/SimulateClockFragment.java index d70708e..3a5ce7c 100644 --- a/app/src/main/java/clock/socoolby/com/clock/fragment/SimulateClockFragment.java +++ b/app/src/main/java/clock/socoolby/com/clock/fragment/simulate/SimulateClockFragment.java @@ -1,4 +1,4 @@ -package clock.socoolby.com.clock.fragment; +package clock.socoolby.com.clock.fragment.simulate; import android.os.Bundle; @@ -6,7 +6,6 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProviders; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -19,13 +18,7 @@ import clock.socoolby.com.clock.viewmodel.ViewModelFactory; import clock.socoolby.com.clock.widget.animatorview.AnimatorView; import clock.socoolby.com.clock.widget.animatorview.animator.ClockAnimator; import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.AbstractClock; -import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.CircleClock; -import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.CircleTwoClock; import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.ClockFactory; -import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.HelixClock; -import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.HexagonalClock; -import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.OvalClock; -import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.SquareClock; import clock.socoolby.com.clock.widget.animatorview.animator.clockanimator.pointer.PointerFactory; /** @@ -42,6 +35,8 @@ public class SimulateClockFragment extends Fragment { AnimatorView clockView; + ClockAnimator clockAnimator=null; + public SimulateClockFragment() { // Required empty public constructor } @@ -50,8 +45,8 @@ public class SimulateClockFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); clockAnimator = new ClockAnimator(); - simulateViewModel= ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(SimulateViewModel.class); - globalViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel(),ClockApplication.getInstance().getEntityManager())).get(GlobalViewModel.class); + simulateViewModel= ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(SimulateViewModel.class); + globalViewModel=ViewModelProviders.of(getActivity(), new ViewModelFactory(ClockApplication.getInstance().getModel())).get(GlobalViewModel.class); } @Override @@ -76,10 +71,11 @@ public class SimulateClockFragment extends Fragment { @Override public void onPause() { super.onPause(); - clockAnimator.stop(); + clockAnimator.pause(); } private void bindViewModel(){ + simulateViewModel.getClockTypeName().observe(this, new Observer() { @Override public void onChanged(String s) { @@ -87,13 +83,6 @@ public class SimulateClockFragment extends Fragment { } }); - simulateViewModel.getPointerTypeName().observe(this, new Observer() { - @Override - public void onChanged(String s) { - setClockPointer(s); - } - }); - globalViewModel.getForegroundColor().observe(this, new Observer() { @Override public void onChanged(Integer integer) { @@ -110,21 +99,23 @@ public class SimulateClockFragment extends Fragment { simulateViewModel.getSimulateClockColorScale().observe(this,color->clockAnimator.setmColorDefaultScale(color)); simulateViewModel.getSimulateClockColorScaleParticularly().observe(this,color->clockAnimator.setmColorParticularyScale(color)); + + simulateViewModel.getPointerTypeName().observe(this, new Observer() { + @Override + public void onChanged(String s) { + setClockPointer(s); + } + }); } - ClockAnimator clockAnimator=null; - - private void setFullScreenClock(String clockStyle,String pointerStyle){ - setClockStyle(clockStyle); - setClockPointer(pointerStyle); - } AbstractClock clock; private void setClockStyle(String clockStyle){ - clockAnimator.setColor(globalViewModel.getForegroundColor().getValue()); + //clockAnimator.setColor(globalViewModel.getForegroundColor().getValue()); clock= ClockFactory.build(clockStyle); clockAnimator.setClock(clock); + clockAnimator.setClockPointer(PointerFactory.build(simulateViewModel.getPointerTypeName().getValue())); } private void setClockPointer(String clockPointerStyle){ diff --git a/app/src/main/java/clock/socoolby/com/clock/model/DigitPerferenceModel.java b/app/src/main/java/clock/socoolby/com/clock/model/DigitPerferenceModel.java new file mode 100644 index 0000000..172e4af --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/model/DigitPerferenceModel.java @@ -0,0 +1,127 @@ +package clock.socoolby.com.clock.model; + +import org.json.JSONException; +import org.json.JSONObject; + +public class DigitPerferenceModel { + protected final static String KEY_FONT_NAME = "key_font_name"; + protected String fontName="default"; + + protected final static String KEY_IS_LINEARGRADIENT_ABLE="key_time_text_is_linearGradient_able"; + protected boolean linearGradientAble = false; + + protected final static String KEY_FOREGROUND_TIME_COLORS_ARRAY="key_time_text_foreground_time_colors_array"; + protected Integer[] timeColorsArray=null; + + protected final static String KEY_IS_REFLECTED_ABLE="key_time_text_is_reflectedAble_able"; + protected boolean reflectedAble = false; + + protected final static String KEY_TIME_TEXT_SHADOW_TYPE="key_time_text_shadowType"; + protected Integer shadowType=0; + + protected final static String KEY_TIME_TEXT_CHAR_ANIMATOR_TYPE="key_time_text_charAnimatorType"; + protected Integer timeTextCharAnimatorType=0; + + protected final static String KEY_IS_DISPLAY_SECOND = "key_is_display_second"; + protected boolean displaySecond = true; + + public void fromJsonString(JSONObject jsonObject) throws JSONException { + linearGradientAble=jsonObject.optBoolean(KEY_IS_LINEARGRADIENT_ABLE,false); + timeColorsArray=stringToIntegerArray(jsonObject.optString(KEY_FOREGROUND_TIME_COLORS_ARRAY,null)); + reflectedAble=jsonObject.optBoolean(KEY_IS_REFLECTED_ABLE); + shadowType=jsonObject.optInt(KEY_TIME_TEXT_SHADOW_TYPE,0); + timeTextCharAnimatorType=jsonObject.optInt(KEY_TIME_TEXT_CHAR_ANIMATOR_TYPE,0); + fontName=jsonObject.optString(KEY_FONT_NAME,"default"); + displaySecond = jsonObject.getBoolean(KEY_IS_DISPLAY_SECOND); + } + + + public void toJsonString(JSONObject jsonObject) throws JSONException { + jsonObject.put(KEY_IS_LINEARGRADIENT_ABLE,linearGradientAble); + jsonObject.put(KEY_FOREGROUND_TIME_COLORS_ARRAY,integerArrayToString(timeColorsArray)); + jsonObject.put(KEY_IS_REFLECTED_ABLE,reflectedAble); + jsonObject.put(KEY_TIME_TEXT_SHADOW_TYPE,shadowType); + jsonObject.put(KEY_TIME_TEXT_CHAR_ANIMATOR_TYPE,timeTextCharAnimatorType); + jsonObject.put(KEY_FONT_NAME,fontName); + jsonObject.put(KEY_IS_DISPLAY_SECOND, displaySecond); + } + + public static String integerArrayToString(Integer[] fromArrays){ + if(fromArrays==null) + return ""; + StringBuffer sb = new StringBuffer(); + for(int i=0;i map = new HashMap<>(); + map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "假").toString(), + getSchemeCalendar(year, month, 3, 0xFF40db25, "假")); + map.put(getSchemeCalendar(year, month, 6, 0xFFe69138, "事").toString(), + getSchemeCalendar(year, month, 6, 0xFFe69138, "事")); + map.put(getSchemeCalendar(year, month, 9, 0xFFdf1356, "议").toString(), + getSchemeCalendar(year, month, 9, 0xFFdf1356, "议")); + map.put(getSchemeCalendar(year, month, 13, 0xFFedc56d, "记").toString(), + getSchemeCalendar(year, month, 13, 0xFFedc56d, "记")); + map.put(getSchemeCalendar(year, month, 14, 0xFFedc56d, "记").toString(), + getSchemeCalendar(year, month, 14, 0xFFedc56d, "记")); + map.put(getSchemeCalendar(year, month, 15, 0xFFaacc44, "假").toString(), + getSchemeCalendar(year, month, 15, 0xFFaacc44, "假")); + map.put(getSchemeCalendar(year, month, 18, 0xFFbc13f0, "记").toString(), + getSchemeCalendar(year, month, 18, 0xFFbc13f0, "记")); + map.put(getSchemeCalendar(year, month, 22, 0xFFdf1356, "议").toString(), + getSchemeCalendar(year, month, 22, 0xFFdf1356, "议")); + map.put(getSchemeCalendar(year, month, 25, 0xFF13acf0, "假").toString(), + getSchemeCalendar(year, month, 25, 0xFF13acf0, "假")); + map.put(getSchemeCalendar(year, month, 27, 0xFF13acf0, "多").toString(), + getSchemeCalendar(year, month, 27, 0xFF13acf0, "多")); + //此方法在巨大的数据量上不影响遍历性能,推荐使用 + mCalendarView.setSchemeDate(map); + } + + private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) { + Calendar calendar = new Calendar(); + calendar.setYear(year); + calendar.setMonth(month); + calendar.setDay(day); + calendar.setSchemeColor(color);//如果单独标记颜色、则会使用这个颜色 + calendar.setScheme(text); + calendar.addScheme(color, "假"); + calendar.addScheme(day%2 == 0 ? 0xFF00CD00 : 0xFFD15FEE, "节"); + calendar.addScheme(day%2 == 0 ? 0xFF660000 : 0xFF4169E1, "记"); + return calendar; } } diff --git a/app/src/main/java/clock/socoolby/com/clock/pop/RingPopup.java b/app/src/main/java/clock/socoolby/com/clock/pop/RingPopup.java deleted file mode 100644 index 67df046..0000000 --- a/app/src/main/java/clock/socoolby/com/clock/pop/RingPopup.java +++ /dev/null @@ -1,22 +0,0 @@ -package clock.socoolby.com.clock.pop; - -import android.content.Context; -import android.view.View; - -import razerdp.basepopup.BasePopupWindow; - -public class RingPopup extends BasePopupWindow implements View.OnClickListener{ - public RingPopup(Context context) { - super(context); - } - - @Override - public void onClick(View v) { - - } - - @Override - public View onCreateContentView() { - return null; - } -} diff --git a/app/src/main/java/clock/socoolby/com/clock/pop/TimeSetupMinPopup.java b/app/src/main/java/clock/socoolby/com/clock/pop/TimeSetupMinPopup.java new file mode 100644 index 0000000..8623093 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/pop/TimeSetupMinPopup.java @@ -0,0 +1,116 @@ +package clock.socoolby.com.clock.pop; + +import android.content.Context; +import android.view.View; +import android.view.animation.Animation; +import android.widget.TextView; +import clock.socoolby.com.clock.R; +import io.feeeei.circleseekbar.CircleSeekBar; +import razerdp.basepopup.BasePopupWindow; + +public class TimeSetupMinPopup extends BasePopupWindow { + private CircleSeekBar mHourSeekbar; + + private CircleSeekBar mMinuteSeekbar; + + private TextView mTextView; + + private int hour=0,minute=0; + + OnTimeChangeListener changeListener; + + + public TimeSetupMinPopup(Context context) { + super(context); + } + + + // 必须实现,这里返回您的contentView + // 为了让库更加准确的做出适配,强烈建议使用createPopupById()进行inflate + @Override + public View onCreateContentView() { + View content=createPopupById(R.layout.pop_union_time_min); + mHourSeekbar = (CircleSeekBar) content.findViewById(R.id.seek_hour); + mMinuteSeekbar = (CircleSeekBar) content.findViewById(R.id.seek_minute); + mTextView = (TextView)content.findViewById(R.id.seek_time); + + mTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(changeListener!=null) + changeListener.onChanged(hour,minute); + TimeSetupMinPopup.this.dismiss(); + } + }); + + mHourSeekbar.setOnSeekBarChangeListener(new CircleSeekBar.OnSeekBarChangeListener() { + @Override + public void onChanged(CircleSeekBar seekbar, int curValue) { + changeText(curValue, mMinuteSeekbar.getCurProcess()); + } + }); + mHourSeekbar.fillInside(); + + mMinuteSeekbar.setOnSeekBarChangeListener(new CircleSeekBar.OnSeekBarChangeListener() { + @Override + public void onChanged(CircleSeekBar seekbar, int curValue) { + changeText(mHourSeekbar.getCurProcess(), curValue); + } + }); + + mHourSeekbar.setCurProcess(hour); + mMinuteSeekbar.setCurProcess(minute); + mMinuteSeekbar.setMaxProcess(60); + mHourSeekbar.setMaxProcess(120); + + + return content; + } + + public void init(int hour, int minute) { + if(mHourSeekbar!=null) { + mHourSeekbar.setCurProcess(hour); + mMinuteSeekbar.setCurProcess(minute); + }else{ + this.hour=hour; + this.minute=minute; + } + } + + private void changeText(int hour, int minute) { + this.hour=hour; + this.minute=minute; + int day=hour/60; + int inHour=hour; + String hourStr=""; + if(hour>=60) { + hourStr = day > 9 ? day + "" : "0" + day + ":"; + inHour=hour-day*60; + } + hourStr += inHour > 9 ? inHour + "" : "0" + inHour; + String minuteStr = minute > 9 ? minute + "" : "0" + minute; + mTextView.setText(hourStr + ":" + minuteStr); + } + + + // 以下为可选代码(非必须实现) + // 返回作用于PopupWindow的show和dismiss动画,本库提供了默认的几款动画,这里可以自由实现 + @Override + protected Animation onCreateShowAnimation() { + return getDefaultScaleAnimation(true); + } + + @Override + protected Animation onCreateDismissAnimation() { + return getDefaultScaleAnimation(false); + } + + public void setOnSeekBarChangeListener(OnTimeChangeListener l){ + this.changeListener=l; + } + + public interface OnTimeChangeListener { + void onChanged(int hour, int minute); + } + +} \ No newline at end of file diff --git a/app/src/main/java/clock/socoolby/com/clock/pop/TimeSetupPopup.java b/app/src/main/java/clock/socoolby/com/clock/pop/TimeSetupPopup.java index 186cabd..75f269e 100644 --- a/app/src/main/java/clock/socoolby/com/clock/pop/TimeSetupPopup.java +++ b/app/src/main/java/clock/socoolby/com/clock/pop/TimeSetupPopup.java @@ -1,15 +1,33 @@ package clock.socoolby.com.clock.pop; -import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; import android.view.View; -import android.view.animation.Animation; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RadioButton; +import android.widget.RadioGroup; import android.widget.TextView; -import clock.socoolby.com.clock.R; -import io.feeeei.circleseekbar.CircleSeekBar; -import razerdp.basepopup.BasePopupWindow; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; -public class TimeSetupPopup extends BasePopupWindow { +import clock.socoolby.com.clock.MainActivity; +import clock.socoolby.com.clock.R; +import clock.socoolby.com.clock.fragment.handup.HandUpDefaultFragment; +import clock.socoolby.com.clock.fragment.handup.HandUpSelect123Fragment; +import io.feeeei.circleseekbar.CircleSeekBar; +import xyz.aprildown.ultimatemusicpicker.MusicPickerListener; +import xyz.aprildown.ultimatemusicpicker.UltimateMusicPicker; + +public class TimeSetupPopup extends DialogFragment implements MusicPickerListener { private CircleSeekBar mHourSeekbar; private CircleSeekBar mMinuteSeekbar; @@ -20,26 +38,65 @@ public class TimeSetupPopup extends BasePopupWindow { OnTimeChangeListener changeListener; - public TimeSetupPopup(Context context) { - super(context); + Uri uri; + + String s; + + MainActivity activity; + + Button musicSelect; + + ImageView back; + + RadioGroup handUpAlterTypeGroup; + + RadioButton handUpAlterTypeDefault; + + RadioButton handUpAlterTypeSelect; + + String handUpAlterType; + + ImageView ok; + + + public TimeSetupPopup(MainActivity activity) { + this.activity=activity; } - - // 必须实现,这里返回您的contentView - // 为了让库更加准确的做出适配,强烈建议使用createPopupById()进行inflate + @Nullable @Override - public View onCreateContentView() { - View content=createPopupById(R.layout.pop_union_time); + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View content=inflater.inflate(R.layout.pop_union_time,container); mHourSeekbar = (CircleSeekBar) content.findViewById(R.id.seek_hour); mMinuteSeekbar = (CircleSeekBar) content.findViewById(R.id.seek_minute); mTextView = (TextView)content.findViewById(R.id.seek_time); + musicSelect=content.findViewById(R.id.tv_handup_time_select_Music); + + back=content.findViewById(R.id.tv_handup_time_back); + + back.setOnClickListener(view-> dismiss()); + + ok=content.findViewById(R.id.tv_handup_time_ok); + + ok.setOnClickListener(view->{ + if(changeListener!=null) + changeListener.onChanged(hour,minute,uri,s,handUpAlterType); + dismiss(); + }); + + + musicSelect.setOnClickListener(v -> { + UltimateMusicPicker picker=new UltimateMusicPicker(); + picker.removeSilent().ringtone().alarm().music().notification().goWithDialog(getChildFragmentManager()); + }); + mTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(changeListener!=null) - changeListener.onChanged(hour,minute); - TimeSetupPopup.this.dismiss(); + changeListener.onChanged(hour,minute,uri,s,handUpAlterType); + dismiss(); } }); @@ -62,10 +119,50 @@ public class TimeSetupPopup extends BasePopupWindow { mMinuteSeekbar.setCurProcess(minute); mMinuteSeekbar.setMaxProcess(60); mHourSeekbar.setMaxProcess(120); + + handUpAlterTypeGroup=content.findViewById(R.id.tv_huad_up_style_group); + + handUpAlterTypeDefault=content.findViewById(R.id.tv_huad_up_style_default); + + handUpAlterTypeSelect=content.findViewById(R.id.tv_huad_up_style_select); + + switch (handUpAlterType){ + case HandUpSelect123Fragment.NAME: + handUpAlterTypeSelect.setChecked(true); + break; + case HandUpDefaultFragment.NAME: + handUpAlterTypeDefault.setChecked(true); + } + + handUpAlterTypeGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + handUpAlterType = HandUpDefaultFragment.NAME; + switch (checkedId){ + case R.id.tv_huad_up_style_select: + handUpAlterType = HandUpSelect123Fragment.NAME; + break; + } + + } + }); + + musicSelect.setText(s); + return content; } - public void init(int hour, int minute) { + @Override + public void onActivityCreated(Bundle savedInstanceState) { + getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); + super.onActivityCreated(savedInstanceState); + + getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0x00000000)); + getDialog().getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); + } + + + public void init(int hour, int minute,String handUpAlterType,Uri musicUri,String musicName) { if(mHourSeekbar!=null) { mHourSeekbar.setCurProcess(hour); mMinuteSeekbar.setCurProcess(minute); @@ -73,6 +170,10 @@ public class TimeSetupPopup extends BasePopupWindow { this.hour=hour; this.minute=minute; } + this.s=musicName; + this.uri=musicUri; + this.handUpAlterType=handUpAlterType; + } private void changeText(int hour, int minute) { @@ -91,24 +192,28 @@ public class TimeSetupPopup extends BasePopupWindow { } - // 以下为可选代码(非必须实现) - // 返回作用于PopupWindow的show和dismiss动画,本库提供了默认的几款动画,这里可以自由实现 - @Override - protected Animation onCreateShowAnimation() { - return getDefaultScaleAnimation(true); - } - - @Override - protected Animation onCreateDismissAnimation() { - return getDefaultScaleAnimation(false); - } - public void setOnSeekBarChangeListener(OnTimeChangeListener l){ this.changeListener=l; } + + @Override + public void onMusicPick(Uri uri, String s) { + Log.d("time Setup","on music pick:"+uri.toString()); + this.uri=uri; + this.s=s; + musicSelect.setText(s); + } + + @Override + public void onPickCanceled() { + this.uri=null; + this.s="default"; + musicSelect.setText(s); + } + public interface OnTimeChangeListener { - void onChanged(int hour, int minute); + void onChanged(int hour, int minute,Uri uri, String s,String hundUpStyle); } } \ No newline at end of file diff --git a/app/src/main/java/clock/socoolby/com/clock/state/ClockStateMachine.java b/app/src/main/java/clock/socoolby/com/clock/state/ClockStateMachine.java index 3f5482f..62ff76c 100644 --- a/app/src/main/java/clock/socoolby/com/clock/state/ClockStateMachine.java +++ b/app/src/main/java/clock/socoolby/com/clock/state/ClockStateMachine.java @@ -6,7 +6,6 @@ import android.util.Log; import com.haibin.calendarview.LunarCalendarManager; -import java.sql.Time; import java.util.Date; import java.util.Timer; import java.util.TimerTask; @@ -92,10 +91,14 @@ public class ClockStateMachine implements Handler.Callback{ } public void setCurrentShowTimeType(ClockTimeTypeEnum type){ - if(getCurrentModeEnum()==ClockModeEnum.HANDUP) - stopHandUp(true); - else if(getCurrentModeEnum()==ClockModeEnum.DELAY) - stopHandUpDelay(); + switch (getCurrentModeEnum()){ + case HANDUP: + //stopHandUp(true); + return; + case DELAY: + stopHandUpDelay(); + return; + } this.showTimeType=type; countingDateTimeBase=null; switch (type){ @@ -116,6 +119,7 @@ public class ClockStateMachine implements Handler.Callback{ private void updateTime() { heartbeat=!heartbeat; DateModel date = new DateModel(); + globalViewModel.setHeartbeat(heartbeat); String timeString=null; switch (getCurrentModeEnum()){ case NORMAL: @@ -137,9 +141,10 @@ public class ClockStateMachine implements Handler.Callback{ digitViewModel.getTimeText().setValue(timeString); break; case HANDUP: - globalViewModel.setHeartbeat(heartbeat); break; case DELAY: + if(countingDateTimeBase==null) + countingDateTimeBase=new Date(); DateModel temp=new DateModel(countingDateTimeBase); timeString=temp.getTimeString(false); if (!model.isTickSound()) { @@ -148,19 +153,25 @@ public class ClockStateMachine implements Handler.Callback{ digitViewModel.getTimeText().setValue(timeString); break; } - reportTime(date); updateDay(date); + reportTime(date); updateHourSytemStyle(date); } - int beforeHourForUpdateSystem=-1; private void updateHourSytemStyle(DateModel date){ - if(beforeHourForUpdateSystem!=date.getHour()) { - beforeHourForUpdateSystem=date.getHour(); - globalViewModel.getTime_hour().setValue(date.getHour()); + if(globalViewModel.getTime_hour().getValue()!=date.getHour()) { + Log.d(TAG,"in state machine hour changed:"+globalViewModel.getTime_hour().getValue()+"->"+date.getHour()); + globalViewModel.setTime_hour(date.getHour()); + if(isHourAnimatorAble()) + globalViewModel.setTimeHourAnimatorStarting(true); } } + private boolean isHourAnimatorAble(){ + boolean ret=getCurrentModeEnum()==ClockModeEnum.NORMAL; + return ret&&getCurrentShowTimeType()==TIME; + } + DateModel currentDate=null; private void updateDay(DateModel date){ if(currentDate==null||currentDate.getDay()!=date.getDay()) { @@ -203,13 +214,13 @@ public class ClockStateMachine implements Handler.Callback{ int today = date.getWeek(); if (model.getTypeHourPower() != Constants.TALKING_NO_REPORT) { + //Log.d(TAG, String.format("reportTime Year:%d Month:%d Day:%d Hour:%d Minute:%d Today:%d", year, month, day, hour, minute, today)); + if (!alterManager.isReport(hour, minute)) + return; if ((minute == 30 || minute == 0) && model.getTypeHourPower() == Constants.TALKING_HALF_AN_HOUR && second == 0) { - Log.d(TAG, String.format("reportTime Year:%d Month:%d Day:%d Hour:%d Minute:%d Today:%d", year, month, day, hour, minute, today)); - if (alterManager.isReport(hour, minute)) - Player.getInstance().reportTime(ClockApplication.getContext(), year, month, day, hour, minute, today); + Player.getInstance().reportTime(ClockApplication.getContext(), year, month, day, hour, minute, today); } else if (model.getTypeHourPower() == Constants.TALKING_HOURS && minute == 0 && second == 0) { - if (alterManager.isReport(hour, minute)) - Player.getInstance().reportTime(ClockApplication.getContext(), year, month, day, hour, minute, today); + Player.getInstance().reportTime(ClockApplication.getContext(), year, month, day, hour, minute, today); } } } @@ -218,7 +229,6 @@ public class ClockStateMachine implements Handler.Callback{ timer.cancel(); } - //handUp public void stopHandUp(boolean userCheckStop){ if(!userCheckStop&&showTimeType==TIME){ diff --git a/app/src/main/java/clock/socoolby/com/clock/utils/Player.java b/app/src/main/java/clock/socoolby/com/clock/utils/Player.java index 841f12d..3ec1c9b 100755 --- a/app/src/main/java/clock/socoolby/com/clock/utils/Player.java +++ b/app/src/main/java/clock/socoolby/com/clock/utils/Player.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.res.AssetFileDescriptor; import android.media.AudioManager; import android.media.MediaPlayer; +import android.net.Uri; import android.util.Log; import java.io.IOException; @@ -214,4 +215,44 @@ public class Player { mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); return mediaPlayer; } + + boolean isPlaying=false; + public void playRing(Context activity, Uri uri){ + + if (mediaPlayer == null) { + mediaPlayer = buildMediaPlayer(); + isPlaying=false; + } + + if(isPlaying) + return; + + try { + mediaPlayer.reset(); + mediaPlayer.setDataSource(activity,uri,null); + mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME); + mediaPlayer.prepare(); + mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + mp.seekTo(0); + mp.stop(); + isPlaying=false; + } + }); + isPlaying=true; + mediaPlayer.start(); + } catch (IOException ioe) { + mediaPlayer = null; + isPlaying=false; + } + } + + public void resert(){ + isPlaying=false; + if(mediaPlayer!=null&&mediaPlayer.isPlaying()) { + mediaPlayer.reset(); + mediaPlayer.stop(); + } + } } diff --git a/app/src/main/java/clock/socoolby/com/clock/viewmodel/AlterViewModel.java b/app/src/main/java/clock/socoolby/com/clock/viewmodel/AlterViewModel.java index 653f2cb..d9aa43a 100644 --- a/app/src/main/java/clock/socoolby/com/clock/viewmodel/AlterViewModel.java +++ b/app/src/main/java/clock/socoolby/com/clock/viewmodel/AlterViewModel.java @@ -14,6 +14,8 @@ public class AlterViewModel extends ViewModel { private MutableLiveData handUPDialy=new MutableLiveData<>(); + private MutableLiveData handUpMusicName=new MutableLiveData<>(); + //alter handUp UI SharePerferenceModel model; @@ -26,7 +28,10 @@ public class AlterViewModel extends ViewModel { public void loadFromModel(){ String handUpMusicString=model.getHandUpMusic(); Uri musicUri=handUpMusicString.isEmpty()?null:Uri.parse(handUpMusicString); + handUpMusic.setValue(musicUri); + handUpMusicName.setValue(model.getHandUpMusicName()); + handUPDialy.setValue(model.getHandUpDialy()); } @@ -37,4 +42,26 @@ public class AlterViewModel extends ViewModel { public MutableLiveData getHandUPDialy() { return handUPDialy; } + + public void setHandUpMusic(Uri handUpMusic) { + this.handUpMusic.setValue(handUpMusic); + if(handUpMusic==null) + model.setHandUpMusic(""); + else + model.setHandUpMusic(handUpMusic.toString()); + } + + public void setHandUPDialy(Integer handUPDialy) { + this.handUPDialy.setValue(handUPDialy); + model.setHandUpDialy(handUPDialy); + } + + public MutableLiveData getHandUpMusicName() { + return handUpMusicName; + } + + public void setHandUpMusicName(String handUpMusicName) { + this.handUpMusicName.setValue(handUpMusicName); + model.setHandUpMusicName(handUpMusicName); + } } diff --git a/app/src/main/java/clock/socoolby/com/clock/viewmodel/DigitViewModel.java b/app/src/main/java/clock/socoolby/com/clock/viewmodel/DigitViewModel.java index 0462592..27d55b7 100644 --- a/app/src/main/java/clock/socoolby/com/clock/viewmodel/DigitViewModel.java +++ b/app/src/main/java/clock/socoolby/com/clock/viewmodel/DigitViewModel.java @@ -30,6 +30,8 @@ public class DigitViewModel extends ViewModel { private MutableLiveData baseLineDown=new MutableLiveData<>(); + private MutableLiveData timeFontName =new MutableLiveData<>(); + SharePerferenceModel model; public DigitViewModel(SharePerferenceModel model) { @@ -37,7 +39,7 @@ public class DigitViewModel extends ViewModel { loadFromModel(); } - private void loadFromModel(){ + public void loadFromModel(){ displaySecond.setValue(model.isDisplaySecond()); linearGradientAble.setValue(model.isLinearGradientAble()); timeLinearGradientColorsArray.setValue(model.getTimeColorsArray()); @@ -46,6 +48,7 @@ public class DigitViewModel extends ViewModel { timeCharAnimatorType.setValue(CharAnimatorEnum.valueOf(model.getTimeTextCharAnimatorType())); baseLineDown.setValue(0); timeFontStyleSize.setValue(100); + timeFontName.setValue(model.getFontName()); } public MutableLiveData getDisplaySecond() { @@ -135,4 +138,9 @@ public class DigitViewModel extends ViewModel { public void setBaseLineDown(Integer baseLineDown) { this.baseLineDown.setValue(baseLineDown); } + + public MutableLiveData getTimeFontName() { + return timeFontName; + } + } diff --git a/app/src/main/java/clock/socoolby/com/clock/viewmodel/GlobalViewModel.java b/app/src/main/java/clock/socoolby/com/clock/viewmodel/GlobalViewModel.java index d552d14..9e29d75 100644 --- a/app/src/main/java/clock/socoolby/com/clock/viewmodel/GlobalViewModel.java +++ b/app/src/main/java/clock/socoolby/com/clock/viewmodel/GlobalViewModel.java @@ -47,6 +47,13 @@ public class GlobalViewModel extends ViewModel { private MutableLiveData handUpAble=new MutableLiveData<>(); + private MutableLiveData handUpTypeName=new MutableLiveData<>(); + + private MutableLiveData hourAlterTypeName=new MutableLiveData<>(); + + private MutableLiveData timeHourAnimatorStarting =new MutableLiveData<>(); + + private MutableLiveData timeHourAnimatordialy=new MutableLiveData<>(); //state private MutableLiveData clockModeEnum=new MutableLiveData<>(); @@ -88,8 +95,17 @@ public class GlobalViewModel extends ViewModel { handUpAble.setValue(model.isHandUpAble()); handUpTime.setValue(model.getHandUpTime()); + handUpTypeName.setValue(model.getHandUpTypeName()); hourSystem12.setValue(model.isHourSystem12()); + + hourAlterTypeName.setValue(model.getTimeHourAlterTypeName()); + + time_hour.setValue(new Date().getHours()); + + timeHourAnimatorStarting.setValue(false); + + timeHourAnimatordialy.setValue(model.getTimeHourAlterDialy()); } public MutableLiveData getCity() { @@ -182,6 +198,7 @@ public class GlobalViewModel extends ViewModel { public void setForegroundColor(Integer foregroundColor) { this.foregroundColor.setValue(foregroundColor); + model.setForegroundColor(foregroundColor); } public void setBackgroundImageUri(Uri backgroundImageUri) { @@ -199,6 +216,7 @@ public class GlobalViewModel extends ViewModel { public void setBackgroundAnimatorRandomColor(Boolean backgroundAnimatorRandomColor) { this.backgroundAnimatorRandomColor=backgroundAnimatorRandomColor; + model.setBackgroundAnimatorRandomColor(backgroundAnimatorRandomColor); } public void setClockInterfaceTypeEnum(ClockInterfaceTypeEnum clockInterfaceTypeEnum) { @@ -219,7 +237,6 @@ public class GlobalViewModel extends ViewModel { model.setTickSound(tickSound); } - public void setBrightness(Integer brightness) { this.brightness.setValue(brightness); } @@ -260,6 +277,15 @@ public class GlobalViewModel extends ViewModel { model.setHandUpAble(handUpAble); } + public MutableLiveData getHandUpTypeName() { + return handUpTypeName; + } + + public void setHandUpTypeName(String handUpTypeName) { + this.handUpTypeName.setValue(handUpTypeName); + model.setHandUpTypeName(handUpTypeName); + } + public MutableLiveData getHeartbeat() { return heartbeat; } @@ -267,4 +293,32 @@ public class GlobalViewModel extends ViewModel { public void setHeartbeat(Boolean heartbeat) { this.heartbeat.setValue(heartbeat); } + + public MutableLiveData getHourAlterTypeName() { + return hourAlterTypeName; + } + + public void setHourAlterTypeName( String hourAlterTypeName) { + this.hourAlterTypeName.setValue(hourAlterTypeName); + model.setTimeHourAlterTypeName(hourAlterTypeName); + } + + public MutableLiveData getTimeHourAnimatordialy() { + return timeHourAnimatordialy; + } + + public void setTimeHourAnimatordialy(Integer timeHourAnimatordialy) { + this.timeHourAnimatordialy.setValue(timeHourAnimatordialy); + model.setTimeHourAlterDialy(timeHourAnimatordialy); + } + + public MutableLiveData getTimeHourAnimatorStarting() { + return timeHourAnimatorStarting; + } + + public void setTimeHourAnimatorStarting(Boolean timeHourAnimatorStarting) { + this.timeHourAnimatorStarting.setValue(timeHourAnimatorStarting); + } + + } diff --git a/app/src/main/java/clock/socoolby/com/clock/viewmodel/SimulateViewModel.java b/app/src/main/java/clock/socoolby/com/clock/viewmodel/SimulateViewModel.java index c18a866..12bd907 100644 --- a/app/src/main/java/clock/socoolby/com/clock/viewmodel/SimulateViewModel.java +++ b/app/src/main/java/clock/socoolby/com/clock/viewmodel/SimulateViewModel.java @@ -31,7 +31,7 @@ public class SimulateViewModel extends ViewModel { loadFromModel(); } - private void loadFromModel(){ + public void loadFromModel(){ clockTypeName.setValue(model.getSimulateClockTypeName()); pointerTypeName.setValue(model.getSimulateClockPointerTypeName()); diff --git a/app/src/main/java/clock/socoolby/com/clock/viewmodel/ViewModelFactory.java b/app/src/main/java/clock/socoolby/com/clock/viewmodel/ViewModelFactory.java index 624852b..b9b1871 100644 --- a/app/src/main/java/clock/socoolby/com/clock/viewmodel/ViewModelFactory.java +++ b/app/src/main/java/clock/socoolby/com/clock/viewmodel/ViewModelFactory.java @@ -4,17 +4,17 @@ import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import androidx.annotation.NonNull; +import clock.socoolby.com.clock.FontManager; import clock.socoolby.com.clock.model.SharePerferenceModel; import e.odbo.data.dao.EntityManager; public class ViewModelFactory extends ViewModelProvider.NewInstanceFactory{ SharePerferenceModel model; - EntityManager entityManager; - public ViewModelFactory(SharePerferenceModel model, EntityManager entityManager) { + + public ViewModelFactory(SharePerferenceModel model) { this.model = model; - this.entityManager = entityManager; } @NonNull diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/AbstractAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/AbstractAnimator.java index e08f398..fb33942 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/AbstractAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/AbstractAnimator.java @@ -30,8 +30,8 @@ public abstract class AbstractAnimator implements I_A protected boolean randColor=false; //效果场景宽高 - protected int width; - protected int height; + protected int width=10; + protected int height=10; protected ArrayList list = new ArrayList<>(); protected ValueAnimator animator; @@ -52,6 +52,8 @@ public abstract class AbstractAnimator implements I_A this.context=context; width=main.getWidth(); height=main.getHeight(); + if(width==0||height==0) + width=height=10; } @Override diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/AnimatorView.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/AnimatorView.java index 6df33a0..34439ec 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/AnimatorView.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/AnimatorView.java @@ -28,7 +28,6 @@ public class AnimatorView extends View { super(context, attrs, defStyleAttr); } - @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleAnimator.java index 6a28141..9ea91e8 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleAnimator.java @@ -15,6 +15,8 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; public class BubbleAnimator extends AbstractAnimator { + public static final String NAME="Bubble"; + private int mBubbleMaxRadius = 30; // 气泡最大半径 px private int mBubbleMinRadius = 5; // 气泡最小半径 px private int mBubbleMaxSize = 30; // 气泡数量 diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleCollisionAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleCollisionAnimator.java index 109549c..874d008 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleCollisionAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleCollisionAnimator.java @@ -10,6 +10,7 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //引用自:https://blog.csdn.net/u010386612/article/details/50580080 public class BubbleCollisionAnimator extends AbstractAnimator { + public static final String NAME="BubbleCollision"; private int maxRadius; // 小球最大半径 private int minRadius; // 小球最小半径 diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleWhirlPoolAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleWhirlPoolAnimator.java index a6390be..ba252e2 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleWhirlPoolAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/BubbleWhirlPoolAnimator.java @@ -19,6 +19,8 @@ public class BubbleWhirlPoolAnimator extends AbstractAnimator { + public static final String NAME="Carrousel"; + public CarrouselAnimator(int entryQuantity) { super(entryQuantity); } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/ClockAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/ClockAnimator.java index 4cb239b..d48826f 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/ClockAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/ClockAnimator.java @@ -26,7 +26,6 @@ public class ClockAnimator extends AbstractAnimator { public ClockAnimator() { super(DYNAMIC_QUANTITY); - } @Override @@ -62,9 +61,10 @@ public class ClockAnimator extends AbstractAnimator { public void setClockPointer(I_Pointer pointer){ clock.setPointer(pointer); + clock.setmClockColorPointer(mClockColorPointer); + clock.setPointerSecondColor(pointerSecondColor); } - @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/DotsLineAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/DotsLineAnimator.java index 99576b9..5160431 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/DotsLineAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/DotsLineAnimator.java @@ -10,6 +10,8 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; public class DotsLineAnimator extends AbstractAnimator { + public static final String NAME="DotsLine"; + public static final int SLEEP_TIME=7; public DotsLineAnimator(int entryQuantity) { diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FerrisWheelAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FerrisWheelAnimator.java index 89fb4e9..5504c21 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FerrisWheelAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FerrisWheelAnimator.java @@ -4,6 +4,7 @@ package clock.socoolby.com.clock.widget.animatorview.animator; //引用自:https://github.com/iglaweb/Ferris-Wheel public class FerrisWheelAnimator { + public static final String NAME="FerrisWheel"; public class FerrisWheel{ diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FireAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FireAnimator.java index 529eb2d..0c1c382 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FireAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FireAnimator.java @@ -12,6 +12,8 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //参考: https://www.jianshu.com/p/0d4ab16a6b7b public class FireAnimator extends AbstractCacheDifferenceAnimator { + public static final String NAME="Fire"; + public FireAnimator() { super(1); } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FireworkAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FireworkAnimator.java index e268066..6460133 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FireworkAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FireworkAnimator.java @@ -15,6 +15,9 @@ public class FireworkAnimator extends AbstractCacheDifferenceAnimator { private static final String TAG = "Jcs_Fishsss"; + + public static final String NAME = "Jcs_Fishsss"; + private static final float HEAD_RADIUS = 50; protected static final float BODY_LENGHT = HEAD_RADIUS * 3.2f; //第一节身体长度 private static final int BODY_ALPHA = 220; @@ -23,11 +28,22 @@ public class FishAnimator { private static final float FINS_LENGTH = HEAD_RADIUS * 1.3f; public static final float TOTAL_LENGTH = 6.79f * HEAD_RADIUS; - public class Fish{ + public FishAnimator(int entryQuantity) { + super(entryQuantity); + } + + @Override + public Fish createNewEntry() { + if(width<=0) + width=height=100; + return new Fish(rand.nextInt(width),rand.nextInt(height),0); + } + + public class Fish implements I_AnimatorEntry { private Paint mPaint; //控制区域 private int currentValue = 0;//全局控制标志 - private float mainAngle = 90;//角度表示的角 + private float mainAngle = 90;//角度表示的角,鱼头所指方向 private float waveFrequence = 1; //鱼头点 private PointF headPoint; @@ -37,13 +53,13 @@ public class FishAnimator { private Paint bodyPaint; private Path mPath; - public Fish() { - init(); - } + private int startX,startY; - public void run(){ - //currentValue = (int) (animation.getAnimatedValue()); - //invalidateSelf(); + public Fish(int startX,int startY,float mainAngle) { + init(); + this.startX=startX; + this.startY=startY; + this.mainAngle=mainAngle; } private void init() { @@ -161,6 +177,11 @@ public class FishAnimator { //现有角度=原始角度+ sin(域值[-1,1])*可摆动的角度 sin作用是控制周期摆动 float angle = mainAngle + (float) Math.sin(Math.toRadians(currentValue * 1.2 * waveFrequence)) * 2;//中心轴线加偏移量和X轴顺时针方向夹角 headPoint = calculatPoint(middlePoint, BODY_LENGHT / 2,mainAngle); + + //移到指定点 + headPoint.x=headPoint.x+startX; + headPoint.y=headPoint.y+startY; + //画头 canvas.drawCircle(headPoint.x, headPoint.y, HEAD_RADIUS, mPaint); //右鳍 起点 @@ -253,7 +274,6 @@ public class FishAnimator { makeTail(canvas, mainPoint, segementLenght, segmentRadius, angle); - canvas.drawCircle(endPoint.x, endPoint.y, segmentRadius * MP, mPaint); mPath.reset(); mPath.moveTo(point1.x, point1.y); @@ -330,8 +350,6 @@ public class FishAnimator { } - - public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @@ -361,6 +379,30 @@ public class FishAnimator { public int getIntrinsicWidth() { return (int) (8.38f * HEAD_RADIUS); } + + @Override + public void move(int maxWidth, int maxHight) { + finsAngle=finsAngle+0.1F; + if(finsAngle>1) + finsAngle=0; + currentValue=currentValue+30; + if(currentValue>540) + currentValue=0; + + startX++; + if(startX>=width) + startX=0; + } + + @Override + public void onDraw(Canvas canvas, Paint mPaint) { + draw(canvas); + } + + @Override + public void setAnimatorEntryColor(int color) { + mPaint.setColor(color); + } } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FluorescenceAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FluorescenceAnimator.java index bc32d2a..98197ce 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FluorescenceAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/FluorescenceAnimator.java @@ -17,6 +17,8 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; public class FluorescenceAnimator extends AbstractAnimator { + public static final String NAME="Fluorescence"; + private int mParticleRadius = 15; // 粒子大小基数 private int mParticleRandomRadius = 50; // 随机范围(基数上范围) private int mParticleLife = 3000; //生命基数(毫秒) diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/MagicLineAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/MagicLineAnimator.java index 12c2585..f72a96d 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/MagicLineAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/MagicLineAnimator.java @@ -14,6 +14,7 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //引用自:https://github.com/zhangyuChen1991/MagicLine public class MagicLineAnimator extends AbstractCacheDifferenceAnimator { + public static final String NAME="MagicLine"; public MagicLineAnimator() { super(1); diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/PhaserBallAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/PhaserBallAnimator.java index 54c6ebc..0cc7d2a 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/PhaserBallAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/PhaserBallAnimator.java @@ -8,6 +8,9 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //引用自:https://blog.csdn.net/zeroblack/article/details/15351863 public class PhaserBallAnimator extends AbstractAnimator { + + public static final String NAME="PhaserBall"; + public static final int V_MAX = 55; //小球水平速度最大值 public static final int V_MIN = 30; //小球水平速度的最小值 public static final int WOODEDGE = 140; //木板的长度 diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/RainAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/RainAnimator.java index 607a789..be828f9 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/RainAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/RainAnimator.java @@ -13,7 +13,7 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //原作者:https://github.com/xianfeng99/Particle public class RainAnimator extends AbstractAnimator { - + public static final String NAME="Rain"; public RainAnimator(int entryQuantity) { super(entryQuantity); diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SawtoothAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SawtoothAnimator.java index 7a952bd..6e36d0c 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SawtoothAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SawtoothAnimator.java @@ -14,6 +14,8 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //参考自:http://refactor.cn/2016/12/26/GearMachine-Canvas绘制漂亮的齿轮装置/ public class SawtoothAnimator extends AbstractAnimator { + public static final String NAME="Sawtooth"; + public SawtoothAnimator() { super(1); } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SkyAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SkyAnimator.java index 6a8887e..c690e41 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SkyAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SkyAnimator.java @@ -11,6 +11,7 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; public class SkyAnimator extends AbstractAnimator { + public static final String NAME="Sky"; public SkyAnimator(int entryQuantity) { super(entryQuantity); diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SnowAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SnowAnimator.java index dc19c91..a96029f 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SnowAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/SnowAnimator.java @@ -13,6 +13,8 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; public class SnowAnimator extends AbstractAnimator { + public static final String NAME="Snow"; + public SnowAnimator(int entryQuantity) { super(entryQuantity); } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/StarFallAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/StarFallAnimator.java index d6a0d92..7725201 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/StarFallAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/StarFallAnimator.java @@ -5,6 +5,8 @@ import clock.socoolby.com.clock.R; public class StarFallAnimator extends DrawableArrayFallAnimator { + public static final String NAME="StarFall"; + //小星星图片的资源文件 static int[] picRes = {R.drawable.ic_star ,R.drawable.ic_star1 diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/VorolayAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/VorolayAnimator.java index 13ce218..76d00a6 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/VorolayAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/VorolayAnimator.java @@ -17,6 +17,8 @@ import quatja.com.vorolay.diagram.VoronoiRegion; //参考自:https://github.com/Quatja/Vorolay public class VorolayAnimator extends AbstractAnimator { + public static final String NAME="Vorolay"; + /** * Diagram sites are generating randomly inside the view bounds. diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/WaterAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/WaterAnimator.java index 401de76..2c68179 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/WaterAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/WaterAnimator.java @@ -13,6 +13,7 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //参考自:https://github.com/scwang90/MultiWaveHeader public class WaterAnimator extends AbstractAnimator { + public static final String NAME="Water"; public WaterAnimator() { this(1); diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/Wave3DAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/Wave3DAnimator.java index 20d5c41..73e93a6 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/Wave3DAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/Wave3DAnimator.java @@ -14,6 +14,8 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; public class Wave3DAnimator extends AbstractAnimator { public static final String Tag=Wave3DAnimator.class.getSimpleName(); + public static final String NAME="Wave3D"; + public Wave3DAnimator() { super(1); } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/WindmillAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/WindmillAnimator.java index c4e0ed0..80fb480 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/WindmillAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/WindmillAnimator.java @@ -10,6 +10,7 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //参考:https://blog.csdn.net/u014112893/article/details/78556098 public class WindmillAnimator extends AbstractAnimator { + public static final String NAME="Windmill"; public WindmillAnimator(int entryQuantity) { super(entryQuantity); @@ -32,6 +33,9 @@ public class WindmillAnimator extends AbstractAnimator { public static final String Tag=EZLedAnimator.class.getSimpleName(); + public static final String NAME="EZLed"; + /** * The max size of a bitmap */ diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/textanimator/EvaporateTextAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/textanimator/EvaporateTextAnimator.java index ffa4bfd..e3cfe97 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/textanimator/EvaporateTextAnimator.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/animatorview/animator/textanimator/EvaporateTextAnimator.java @@ -17,6 +17,8 @@ import clock.socoolby.com.clock.widget.animatorview.I_AnimatorEntry; //参考自:https://github.com/HpWens/MeiWidgetView/blob/master/widget/src/main/java/com/meis/widget/evaporate/ public class EvaporateTextAnimator extends AbstractAnimator { + public static final String NAME="EvaporateText"; + public EvaporateTextAnimator() { super(1); } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullMonthView.java b/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullMonthView.java new file mode 100644 index 0000000..028360b --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullMonthView.java @@ -0,0 +1,141 @@ +package clock.socoolby.com.clock.widget.calendar; + +import android.content.Context; +import android.graphics.BlurMaskFilter; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.Log; +import android.view.View; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.MonthView; + +import java.util.List; + +/** + * 高仿魅族日历布局 + * Created by huanghaibin on 2017/11/15. + */ + +public class FullMonthView extends MonthView { + + private Paint mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + /** + * 自定义魅族标记的圆形背景 + */ + private Paint mSchemeBasicPaint = new Paint(); + + public FullMonthView(Context context) { + super(context); + + mRectPaint.setStyle(Paint.Style.STROKE); + mRectPaint.setStrokeWidth(dipToPx(context, 0.5f)); + mRectPaint.setColor(0x88efefef); + + mSchemeBasicPaint.setAntiAlias(true); + mSchemeBasicPaint.setStyle(Paint.Style.FILL); + mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER); + mSchemeBasicPaint.setFakeBoldText(true); + + //兼容硬件加速无效的代码 + setLayerType(View.LAYER_TYPE_SOFTWARE, mSchemeBasicPaint); + //4.0以上硬件加速会导致无效 + mSelectedPaint.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.SOLID)); + } + + /** + * 绘制选中的日子 + * + * @param canvas canvas + * @param calendar 日历日历calendar + * @param x 日历Card x起点坐标 + * @param y 日历Card y起点坐标 + * @param hasScheme hasScheme 非标记的日期 + * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的 + */ + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + canvas.drawRect(x, y , x + mItemWidth, y + mItemHeight, mSelectedPaint); + return true; + } + + /** + * 绘制标记的事件日子 + * + * @param canvas canvas + * @param calendar 日历calendar + * @param x 日历Card x起点坐标 + * @param y 日历Card y起点坐标 + */ + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + mSchemeBasicPaint.setColor(calendar.getSchemeColor()); + List schemes = calendar.getSchemes(); + if (schemes == null || schemes.size() == 0) { + return; + } + int space = dipToPx(getContext(), 2); + int indexY = y + mItemHeight - 2 * space; + int sw = dipToPx(getContext(), mItemWidth / 10); + int sh = dipToPx(getContext(), 4); + for (Calendar.Scheme scheme : schemes) { + + mSchemePaint.setColor(scheme.getShcemeColor()); + + canvas.drawRect(x + mItemWidth - sw - 2 * space, + + indexY - sh, x + mItemWidth - 2 * space, indexY, mSchemePaint); + indexY = indexY - space -sh; + } + } + + /** + * 绘制文本 + * + * @param canvas canvas + * @param calendar 日历calendar + * @param x 日历Card x起点坐标 + * @param y 日历Card y起点坐标 + * @param hasScheme 是否是标记的日期 + * @param isSelected 是否选中 + */ + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + canvas.drawRect(x, y, x + mItemWidth, y + mItemHeight, mRectPaint); + int cx = x + mItemWidth / 2; + int top = y - mItemHeight / 6; + + boolean isInRange = isInRange(calendar); + + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + mSelectTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint); + } else if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentMonth() && isInRange ? mSchemeTextPaint : mOtherMonthTextPaint); + + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mCurMonthLunarTextPaint); + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() && isInRange ? mCurMonthTextPaint : mOtherMonthTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, + calendar.isCurrentDay() && isInRange ? mCurDayLunarTextPaint : + calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint); + } + } + + /** + * dp转px + * + * @param context context + * @param dpValue dp + * @return px + */ + private static int dipToPx(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullWeekView.java b/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullWeekView.java new file mode 100644 index 0000000..9d48e1a --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullWeekView.java @@ -0,0 +1,118 @@ +package clock.socoolby.com.clock.widget.calendar; +import android.content.Context; +import android.graphics.BlurMaskFilter; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.view.View; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.WeekView; + +import java.util.List; + +/** + * 魅族周视图 + * Created by huanghaibin on 2017/11/29. + */ + +public class FullWeekView extends WeekView { + private Paint mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint mSchemeBasicPaint = new Paint(); + + + public FullWeekView(Context context) { + super(context); + + mRectPaint.setStyle(Paint.Style.STROKE); + mRectPaint.setStrokeWidth(dipToPx(context, 0.5f)); + mRectPaint.setColor(0x88efefef); + + mSchemeBasicPaint.setAntiAlias(true); + mSchemeBasicPaint.setStyle(Paint.Style.FILL); + mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER); + mSchemeBasicPaint.setColor(0xffed5353); + mSchemeBasicPaint.setFakeBoldText(true); + + //兼容硬件加速无效的代码 + setLayerType(View.LAYER_TYPE_SOFTWARE, mSchemeBasicPaint); + //4.0以上硬件加速会导致无效 + mSelectedPaint.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.SOLID)); + } + + /** + * @param canvas canvas + * @param calendar 日历日历calendar + * @param x 日历Card x起点坐标 + * @param hasScheme hasScheme 非标记的日期 + * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的 + */ + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + mSelectedPaint.setStyle(Paint.Style.FILL); + canvas.drawRect(x,0, x + mItemWidth, mItemHeight , mSelectedPaint); + return true; + } + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + mSchemeBasicPaint.setColor(calendar.getSchemeColor()); + List schemes = calendar.getSchemes(); + if (schemes == null || schemes.size() == 0) { + return; + } + int space = dipToPx(getContext(), 2); + int indexY = mItemHeight - 2 * space; + int sw = dipToPx(getContext(), mItemWidth / 10); + int sh = dipToPx(getContext(), 4); + for (Calendar.Scheme scheme : schemes) { + + mSchemePaint.setColor(scheme.getShcemeColor()); + + canvas.drawRect(x + mItemWidth - sw - 2 * space, + + indexY - sh, x + mItemWidth - 2 * space, indexY, mSchemePaint); + indexY = indexY - space -sh; + } + } + + + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + canvas.drawRect(x, 0, x + mItemWidth, mItemHeight, mRectPaint); + int cx = x + mItemWidth / 2; + int top = - mItemHeight / 6; + + boolean isInRange = isInRange(calendar); + + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + mSelectTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mSelectedLunarTextPaint); + } else if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentMonth() && isInRange ? mSchemeTextPaint : mOtherMonthTextPaint); + + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mCurMonthLunarTextPaint); + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() && isInRange ? mCurMonthTextPaint : mOtherMonthTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, + calendar.isCurrentDay() && isInRange ? mCurDayLunarTextPaint : + calendar.isCurrentMonth() ? mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint); + } + } + + /** + * dp转px + * + * @param context context + * @param dpValue dp + * @return px + */ + private static int dipToPx(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} + diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullYearView.java b/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullYearView.java new file mode 100644 index 0000000..d7e4c00 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/widget/calendar/FullYearView.java @@ -0,0 +1,126 @@ +package clock.socoolby.com.clock.widget.calendar; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.YearView; + +/** + * 自定义年视图 + * Created by huanghaibin on 2018/10/9. + */ +@SuppressWarnings("unused") +public class FullYearView extends YearView { + + private int mTextPadding; + /** + * 闰年字体 + */ + private Paint mLeapYearTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + public FullYearView(Context context) { + super(context); + mTextPadding = dipToPx(context, 3); + + mLeapYearTextPaint.setTextSize(dipToPx(context, 12)); + mLeapYearTextPaint.setColor(0xffd1d1d1); + mLeapYearTextPaint.setAntiAlias(true); + mLeapYearTextPaint.setFakeBoldText(true); + + } + + @Override + protected void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int width, int height) { + + String text = getContext() + .getResources() + .getStringArray(com.haibin.calendarview.R.array.month_string_array)[month - 1]; + canvas.drawText(text, + x + mItemWidth / 2 - mTextPadding, + y + mMonthTextBaseLine, + mMonthTextPaint); + if (month == 2 && isLeapYear(year)) { + float w = getTextWidth(mMonthTextPaint, text); + + canvas.drawText("闰年", + x + mItemWidth / 2 - mTextPadding + w + dipToPx(getContext(), 6), + y + mMonthTextBaseLine, + mLeapYearTextPaint); + } + } + + private float getTextWidth(Paint paint, String text) { + return paint.measureText(text); + } + + /** + * 是否是闰年 + * + * @param year year + * @return 是否是闰年 + */ + private static boolean isLeapYear(int year) { + return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); + } + + + @Override + protected void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int height) { + String text = getContext().getResources().getStringArray(com.haibin.calendarview.R.array.year_view_week_string_array)[week]; + canvas.drawText(text, + x + width / 2, + y + mWeekTextBaseLine, + mWeekTextPaint); + } + + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + int radius = Math.min(mItemWidth, mItemHeight) / 8 * 5; + canvas.drawCircle(cx, cy, radius, mSelectedPaint); + return true; + } + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + + } + + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + float baselineY = mTextBaseLine + y; + int cx = x + mItemWidth / 2; + + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + hasScheme ? mSchemeTextPaint : mSelectTextPaint); + } else if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : mSchemeTextPaint); + + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : mCurMonthTextPaint); + } + } + + /** + * dp转px + * + * @param context context + * @param dpValue dp + * @return px + */ + private static int dipToPx(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} \ No newline at end of file diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/textview/DigitTextView.java b/app/src/main/java/clock/socoolby/com/clock/widget/textview/DigitTextView.java index cde237d..8d61a79 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/textview/DigitTextView.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/textview/DigitTextView.java @@ -6,9 +6,11 @@ import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; +import android.graphics.RectF; import android.graphics.Shader; import android.text.TextPaint; import android.util.AttributeSet; +import android.util.Log; import androidx.annotation.Nullable; @@ -19,6 +21,7 @@ import clock.socoolby.com.clock.widget.textview.charanimator.AbstractCharAnimato import clock.socoolby.com.clock.widget.textview.charanimator.CharAnimatorEnum; import clock.socoolby.com.clock.widget.textview.charanimator.Down2UpCharAnimator; import clock.socoolby.com.clock.widget.textview.charanimator.Marquee3DCharAnimator; +import clock.socoolby.com.clock.widget.textview.charanimator.TabDigitCharAnimator; import clock.socoolby.com.clock.widget.textview.charanimator.Up2DownCharAnimator; public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { @@ -32,24 +35,41 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { private ShadowTypeEnum shadowType=ShadowTypeEnum.NOSETUP;//0:不设置,1:阴影,2:浮雕 - private int[] linearGradientColors=null; + private int[] linearGradientColors=new int[]{roundColor(), roundColor(), roundColor(), roundColor(), roundColor()}; - int textWidth=0; private CharSequence preString=null; public DigitTextView(Context context) { super(context); + init(); } public DigitTextView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); + init(); } public DigitTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + init(); } + + private void init(){ + /*mDividerPaint = new Paint(); + mDividerPaint.setAntiAlias(true); + mDividerPaint.setStyle(Paint.Style.FILL_AND_STROKE); + mDividerPaint.setColor(Color.WHITE); + mDividerPaint.setStrokeWidth(2); + + mBackgroundPaint = new Paint(); + mBackgroundPaint.setAntiAlias(true); + mBackgroundPaint.setColor(Color.BLACK);*/ + } + + + public void setBaseLineDown(float baseLineDown) { this.baseLineDown = baseLineDown; } @@ -62,7 +82,6 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { boolean linearGradientReCreate=false; - public void setLinearGradientRandom(boolean able){ if(able){ linearGradientColors= new int[]{roundColor(), roundColor(), roundColor(), roundColor(), roundColor()}; @@ -85,11 +104,9 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { private void checkReCreate(){ mLinearGradient = null; - if(isLinearGradientAble) - //if(isLinearGradientPosAble&&linearGradientColors.length==pos.length) - mLinearGradient = new LinearGradient(0, 0, getWidth(), getHeight(), linearGradientColors , pos, Shader.TileMode.CLAMP); - //else - //mLinearGradient = new LinearGradient(0, 0, getWidth(), 0,linearGradientColors, null, Shader.TileMode.CLAMP); + if(isLinearGradientAble&&linearGradientColors!=null) { + mLinearGradient = new LinearGradient(0, 0, getWidth(), getHeight(), linearGradientColors, pos, Shader.TileMode.CLAMP); + } getPaint().setShader(mLinearGradient); linearGradientReCreate=false; } @@ -150,7 +167,9 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { isReflectedAble = reflectedAble; } + private int textWidth=0; private int textHight; + private int textfontHight; private int baseCharWidth; private int flagCharwidth; private int smallTextHight; @@ -175,19 +194,30 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { float centerY; + CharSequence textToDraw; + + Paint.FontMetricsInt fm; + + int padding=2; + protected void onDraw(Canvas canvas) { mTextPaint=getPaint(); mTextPaint.setColor(getCurrentTextColor()); - CharSequence textToDraw=getText(); + textToDraw=getText(); - Paint.FontMetricsInt fm=mTextPaint.getFontMetricsInt(); + fm=mTextPaint.getFontMetricsInt(); baseCharWidth= getCharWidth("8",mTextPaint); + padding=baseCharWidth/20; + //baseCharWidth+=padding; + flagCharwidth=getCharWidth(":",mTextPaint); + textfontHight=(int)getFontHeight(mTextPaint); textHight=-fm.descent - fm.ascent; + smallTextHight=0; smallCharWidth=0; @@ -195,7 +225,7 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { textSmallSpan=0; if(textLength>4){ - textWidth=baseCharWidth*4+flagCharwidth; + textWidth=(baseCharWidth+padding)*4+flagCharwidth; } if(textLength>7){ @@ -221,6 +251,8 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { startX+=flagCharwidth; }else{ int charWidth= getCharWidth(charStr,mTextPaint); + //Log.d(Tag,"view width:"+getWidth()+"\t heitht:"+getHeight()+"\t startx:"+startX+"\t startY:"+startY+"\t baseCharWidth:"+baseCharWidth+"\t text hight:"+textHight+"\t text font hight:"+textfontHight); + //drawBackground(canvas,startX , startY + baseLineDown-textfontHight+(textfontHight-textHight)/4,baseCharWidth,textfontHight,mBackgroundPaint); if(currentCharAnimatorType!= CharAnimatorEnum.NOSETUP) { charAnimator = charAnimatorHashMap.get(i); if (charAnimator != null && !charAnimator.isCharAnimatorRuning()) { @@ -235,11 +267,15 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { charAnimator.drawCharAnimator(canvas, startX + (baseCharWidth - charWidth) / 2, startY + baseLineDown, mTextPaint); //Log.d(Tag,"charAnimator index i:"+i+"\tanimator percent:"); invalidate(); - }else + }else { drawChar(canvas, charStr, startX + (baseCharWidth - charWidth) / 2, startY + baseLineDown, mTextPaint); - }else + //drawDivider(canvas, startX, startY + baseLineDown - textfontHight + (textfontHight - textHight) / 4, baseCharWidth, textfontHight, mDividerPaint); + } + }else { drawChar(canvas, charStr, startX + (baseCharWidth - charWidth) / 2, startY + baseLineDown, mTextPaint); - startX+=baseCharWidth; + //drawDivider(canvas, startX, startY + baseLineDown - textfontHight +(textfontHight - textHight) / 4, baseCharWidth, textfontHight, mDividerPaint); + } + startX=startX+baseCharWidth+padding; } }else if(i==5) { startX+=smallCharWidth/2; @@ -254,6 +290,16 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { preString=textToDraw; } + Paint mDividerPaint,mBackgroundPaint; + + private void drawBackground(Canvas canvas,float startX,float startY,int width,int height,Paint mBackgroundPaint) { + canvas.drawRoundRect(new RectF(startX,startY,startX+width,startY+height), 10, 10, mBackgroundPaint); + } + + private void drawDivider(Canvas canvas,float startX,float startY,int width,int height,Paint mDividerPaint) { + canvas.drawLine(startX, startY+height/2, startX+width, startY+height/2, mDividerPaint); + } + private void drawChar(Canvas canvas,String c,float startX,float startY,Paint mTextPaint){ if(isReflectedAble) drawCharReflected(canvas,c, startX, startY, mTextPaint); @@ -294,6 +340,9 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { case Marquee3D_Down: charAnimator=new Marquee3DCharAnimator(preString,currentString,Marquee3DCharAnimator.U2D); break; + case TabDigit: + charAnimator=new TabDigitCharAnimator(preString,currentString,true); + break; } return charAnimator; } @@ -313,7 +362,13 @@ public class DigitTextView extends androidx.appcompat.widget.AppCompatTextView { return alpha << 24 | r << 16 | g << 8 | b; } - private static int getCharWidth(String str, Paint paint){ + public static int getCharWidth(String str, Paint paint){ return (int)paint.measureText(str); } + + public float getFontHeight(Paint paint) { + Paint.FontMetrics fm = paint.getFontMetrics(); + return ((int) Math.ceil(fm.descent - fm.top) + 2) ; + } + } diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/textview/charanimator/CharAnimatorEnum.java b/app/src/main/java/clock/socoolby/com/clock/widget/textview/charanimator/CharAnimatorEnum.java index 9f1ea71..ed4875c 100644 --- a/app/src/main/java/clock/socoolby/com/clock/widget/textview/charanimator/CharAnimatorEnum.java +++ b/app/src/main/java/clock/socoolby/com/clock/widget/textview/charanimator/CharAnimatorEnum.java @@ -1,7 +1,7 @@ package clock.socoolby.com.clock.widget.textview.charanimator; public enum CharAnimatorEnum{ - NOSETUP(0),UP2DOWN(1),DOWN2UP(2),Marquee3D_Up(3),Marquee3D_Down(4); + NOSETUP(0),UP2DOWN(1),DOWN2UP(2),Marquee3D_Up(3),Marquee3D_Down(4),TabDigit(5); int styleCode; diff --git a/app/src/main/java/clock/socoolby/com/clock/widget/textview/charanimator/TabDigitCharAnimator.java b/app/src/main/java/clock/socoolby/com/clock/widget/textview/charanimator/TabDigitCharAnimator.java new file mode 100644 index 0000000..51129e0 --- /dev/null +++ b/app/src/main/java/clock/socoolby/com/clock/widget/textview/charanimator/TabDigitCharAnimator.java @@ -0,0 +1,48 @@ +package clock.socoolby.com.clock.widget.textview.charanimator; + +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.xenione.digit.TabDigit; + +public class TabDigitCharAnimator extends AbstractCharAnimator { + + TabDigit tabDigit; + + public TabDigitCharAnimator(String preString, String currentString,boolean up) { + super(preString, currentString); + tabDigit=new TabDigit(preString,currentString,up); + tabDigit.start(); + } + + @Override + public void drawCharPre(Canvas canvas, String strToDraw, float startX, float startY, Paint mTextPaint, float percent) { + + } + + @Override + public void drawCharCurrent(Canvas canvas, String strToDraw, float startX, float startY, Paint mTextPaint, float percent) { + canvas.save(); + canvas.translate(startX,startY-getFontHeight(mTextPaint)); + tabDigit.setmNumberPaint(mTextPaint); + tabDigit.onDraw(canvas); + canvas.restore(); + } + + @Override + public void move() { + super.move(); + tabDigit.run(); + } + + + @Override + public boolean isCharAnimatorRuning() { + return tabDigit.isRunning(); + } + + public float getFontHeight(Paint paint) { + Paint.FontMetrics fm = paint.getFontMetrics(); + return ((int) Math.ceil(fm.descent - fm.top) + 2) + fm.ascent/4 ; + } +} diff --git a/app/src/main/java/clock/socoolby/com/clock/work/WorkManager.java b/app/src/main/java/clock/socoolby/com/clock/work/WorkManager.java deleted file mode 100644 index a0b3f95..0000000 --- a/app/src/main/java/clock/socoolby/com/clock/work/WorkManager.java +++ /dev/null @@ -1,4 +0,0 @@ -package clock.socoolby.com.clock.work; - -public class WorkManager { -} diff --git a/app/src/main/java/com/xenione/digit/AbstractTabAnimation.java b/app/src/main/java/com/xenione/digit/AbstractTabAnimation.java new file mode 100644 index 0000000..ed16997 --- /dev/null +++ b/app/src/main/java/com/xenione/digit/AbstractTabAnimation.java @@ -0,0 +1,43 @@ +package com.xenione.digit; + +public abstract class AbstractTabAnimation { + + protected final static int LOWER_POSITION = 0; + protected final static int MIDDLE_POSITION = 1; + protected final static int UPPER_POSITION = 2; + + protected final TabDigitEntity mTopTab; + protected final TabDigitEntity mBottomTab; + protected final TabDigitEntity mMiddleTab; + + protected int state; + protected int mAlpha = 0; + protected long mTime = -1; + protected float mElapsedTime = 1000.0f; + + public AbstractTabAnimation(TabDigitEntity mTopTab, TabDigitEntity mBottomTab, TabDigitEntity mMiddleTab) { + this.mTopTab = mTopTab; + this.mBottomTab = mBottomTab; + this.mMiddleTab = mMiddleTab; + initState(); + } + + public void start() { + makeSureCycleIsClosed(); + mTime = System.currentTimeMillis(); + } + + public void sync() { + makeSureCycleIsClosed(); + } + + public abstract void initState(); + public abstract void initMiddleTab(); + public abstract void run(); + protected abstract void makeSureCycleIsClosed(); + + public boolean isRunning(){ + return mTime!=-1; + } + +} diff --git a/app/src/main/java/com/xenione/digit/MatrixHelper.java b/app/src/main/java/com/xenione/digit/MatrixHelper.java new file mode 100644 index 0000000..02cffb5 --- /dev/null +++ b/app/src/main/java/com/xenione/digit/MatrixHelper.java @@ -0,0 +1,78 @@ +package com.xenione.digit; + +import android.graphics.Camera; +import android.graphics.Matrix; + +/** + * Created by Eugeni on 16/10/2016. + */ +public class MatrixHelper { + + public static final Camera camera = new Camera(); + + /** + * Matrix with 180 degrees x rotation defined + */ + public static final Matrix MIRROR_X = new Matrix(); + static { + MatrixHelper.rotateX(MIRROR_X, 180); + } + + /** + * Matrix with 0 degrees x rotation defined + */ + public static final Matrix ROTATE_X_0 = new Matrix(); + + static { + MatrixHelper.rotateX(ROTATE_X_0, 0); + } + + /** + * Matrix with 90 degrees x rotation defined + */ + public static final Matrix ROTATE_X_90 = new Matrix(); + + static { + MatrixHelper.rotateX(ROTATE_X_90, 90); + } + + public static void mirrorX(Matrix matrix) { + rotateX(matrix, 180); + } + + public static void rotateX(Matrix matrix, int alpha) { + synchronized (camera) { + camera.save(); + camera.rotateX(alpha); + camera.getMatrix(matrix); + camera.restore(); + } + } + + public static void rotateZ(Matrix matrix, int alpha) { + synchronized (camera) { + camera.save(); + camera.rotateZ(alpha); + camera.getMatrix(matrix); + camera.restore(); + } + } + + public static void translate(Matrix matrix, float dx, float dy, float dz) { + synchronized (camera) { + camera.save(); + camera.translate(dx, dy, dz); + camera.getMatrix(matrix); + camera.restore(); + } + } + + public static void translateY(Matrix matrix, float dy) { + synchronized (camera) { + camera.save(); + camera.translate(0, dy, 0); + camera.getMatrix(matrix); + camera.restore(); + } + } +} diff --git a/app/src/main/java/com/xenione/digit/TabAnimationDown.java b/app/src/main/java/com/xenione/digit/TabAnimationDown.java new file mode 100644 index 0000000..2828bae --- /dev/null +++ b/app/src/main/java/com/xenione/digit/TabAnimationDown.java @@ -0,0 +1,73 @@ +package com.xenione.digit; + +/** + * rotates middle tab downwards + */ +public final class TabAnimationDown extends AbstractTabAnimation { + + public TabAnimationDown(TabDigitEntity mTopTab, TabDigitEntity mBottomTab, TabDigitEntity mMiddleTab) { + super(mTopTab, mBottomTab, mMiddleTab); + } + + public void initState() { + state = UPPER_POSITION; + } + + @Override + public void initMiddleTab() { + mMiddleTab.rotate(180); + } + + @Override + public void run() { + + if (mTime == -1) { + return; + } + + switch (state) { + case LOWER_POSITION: { + if (mAlpha <= 0) { + mBottomTab.next(); + state = UPPER_POSITION; + mTime = -1; // animation finished + } + break; + } + case MIDDLE_POSITION: { + if (mAlpha < 90) { + mMiddleTab.next(); + state = LOWER_POSITION; + } + break; + } + case UPPER_POSITION: { + mTopTab.next(); + state = MIDDLE_POSITION; + break; + } + } + + if (mTime != -1) { + long delta = (System.currentTimeMillis() - mTime); + mAlpha = 180 - (int) (180 * (1 - (1 * mElapsedTime - delta) / (1 * mElapsedTime))); + mMiddleTab.rotate(mAlpha); + } + + } + + @Override + protected void makeSureCycleIsClosed() { + if (mTime == -1) { + return; + } + switch (state) { + case LOWER_POSITION: { + mBottomTab.next(); + state = UPPER_POSITION; + mTime = -1; // animation finished + } + } + mMiddleTab.rotate(180); + } +} diff --git a/app/src/main/java/com/xenione/digit/TabAnimationUp.java b/app/src/main/java/com/xenione/digit/TabAnimationUp.java new file mode 100644 index 0000000..06d5de2 --- /dev/null +++ b/app/src/main/java/com/xenione/digit/TabAnimationUp.java @@ -0,0 +1,76 @@ +package com.xenione.digit; + +/** + * rotates middle tab upwards + */ +public final class TabAnimationUp extends AbstractTabAnimation { + + public TabAnimationUp(TabDigitEntity mTopTab, TabDigitEntity mBottomTab, TabDigitEntity mMiddleTab) { + super(mTopTab, mBottomTab, mMiddleTab); + } + + @Override + public void initState() { + state = LOWER_POSITION; + } + + @Override + public void initMiddleTab() { /* nothing to do */ } + + @Override + public void run() { + + if (mTime == -1) { + return; + } + + switch (state) { + case LOWER_POSITION: { + mBottomTab.next(); + state = MIDDLE_POSITION; + break; + } + case MIDDLE_POSITION: { + if (mAlpha > 90) { + mMiddleTab.next(); + state = UPPER_POSITION; + } + break; + } + case UPPER_POSITION: { + if (mAlpha >= 180) { + mTopTab.next(); + state = LOWER_POSITION; + mTime = -1; // animation finished + } + break; + } + } + + if (mTime != -1) { + long delta = (System.currentTimeMillis() - mTime); + mAlpha = (int) (180 * (1 - (1 * mElapsedTime - delta) / (1 * mElapsedTime))); + mMiddleTab.rotate(mAlpha); + } + + } + + @Override + protected void makeSureCycleIsClosed() { + if (mTime == -1) { + return; + } + switch (state) { + case LOWER_POSITION: { + mMiddleTab.next(); + state = UPPER_POSITION; + } + case UPPER_POSITION: { + mTopTab.next(); + state = LOWER_POSITION; + mTime = -1; // animation finished + } + } + mMiddleTab.rotate(180); + } +} diff --git a/app/src/main/java/com/xenione/digit/TabDigit.java b/app/src/main/java/com/xenione/digit/TabDigit.java new file mode 100644 index 0000000..797fb28 --- /dev/null +++ b/app/src/main/java/com/xenione/digit/TabDigit.java @@ -0,0 +1,218 @@ +package com.xenione.digit; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Rect; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Eugeni on 16/10/2016. + */ +public class TabDigit { + + /* + * false: rotate upwards + * true: rotate downwards + */ + private boolean mReverseRotation = false; + + private TabDigitEntity mTopTab; + + private TabDigitEntity mBottomTab; + + private TabDigitEntity mMiddleTab; + + private List tabs = new ArrayList<>(3); + + private AbstractTabAnimation tabAnimation; + + private Matrix mProjectionMatrix = new Matrix(); + + private int mCornerSize; + + private Paint mNumberPaint; + + private Paint mDividerPaint; + + private Paint mBackgroundPaint; + + private Rect mTextMeasured = new Rect(); + + private int mPadding = 0; + + private String currentChar,nextChar; + + private int width,hight; + + public TabDigit(String currentChar, String nextChar,boolean mReverseRotation) { + this.mReverseRotation = mReverseRotation; + init(currentChar,nextChar); + } + + public void init(String currentChar, String nextChar) { + + this.currentChar=currentChar; + this.nextChar=nextChar; + + initPaints(); + + mPadding = 0; + + mCornerSize = 10; + + initTabs(); + } + + private void initPaints() { + mNumberPaint = new Paint(); + mNumberPaint.setAntiAlias(true); + mNumberPaint.setStyle(Paint.Style.FILL_AND_STROKE); + mNumberPaint.setColor(Color.WHITE); + + mDividerPaint = new Paint(); + mDividerPaint.setAntiAlias(true); + mDividerPaint.setStyle(Paint.Style.FILL_AND_STROKE); + mDividerPaint.setColor(Color.WHITE); + mDividerPaint.setStrokeWidth(1); + + mBackgroundPaint = new Paint(); + mBackgroundPaint.setAntiAlias(true); + mBackgroundPaint.setColor(Color.BLACK); + } + + private void initTabs() { + // top Tab + mTopTab = new TabDigitEntity(currentChar,nextChar,mProjectionMatrix,mCornerSize); + mTopTab.rotate(180); + tabs.add(mTopTab); + + // bottom Tab + mBottomTab = new TabDigitEntity(currentChar,nextChar,mProjectionMatrix,mCornerSize); + tabs.add(mBottomTab); + + // middle Tab + mMiddleTab = new TabDigitEntity(currentChar,nextChar,mProjectionMatrix,mCornerSize); + tabs.add(mMiddleTab); + + tabAnimation = mReverseRotation ? new TabAnimationDown(mTopTab, mBottomTab, mMiddleTab) : new TabAnimationUp(mTopTab, mBottomTab, mMiddleTab); + + tabAnimation.initMiddleTab(); + + setInternalChar(currentChar); + } + + public void setmNumberPaint(Paint mNumberPaint){ + this.mNumberPaint=mNumberPaint; + calculateTextSize(mTextMeasured); + width=mTextMeasured.width(); + hight=mTextMeasured.height(); + setupProjectionMatrix(); + measureTabs(width,hight); + } + + private void setInternalChar(String internalChar) { + for (TabDigitEntity tab : tabs) { + tab.setChar(internalChar); + } + } + + private void setupProjectionMatrix() { + mProjectionMatrix.reset(); + int centerY = hight / 2; + int centerX = width / 2; + MatrixHelper.translate(mProjectionMatrix, centerX, -centerY, 0); + } + + private void measureTabs(int width, int height) { + for (TabDigitEntity tab : tabs) { + tab.measure(width, height); + } + } + + private void drawTabs(Canvas canvas) { + for (TabDigitEntity tab : tabs) { + tab.draw(canvas,mTextMeasured,mNumberPaint,mBackgroundPaint); + } + } + + private void drawDivider(Canvas canvas) { + canvas.save(); + canvas.concat(mProjectionMatrix); + //canvas.drawLine(-canvas.getWidth() / 2, 0, canvas.getWidth() / 2, 0, mDividerPaint); + canvas.drawLine(-width / 2, 0, width / 2, 0, mDividerPaint); + canvas.restore(); + } + + private void calculateTextSize(Rect rect) { + mNumberPaint.getTextBounds("8", 0, 1, rect); + } + + public void setTextSize(int size) { + mNumberPaint.setTextSize(size); + } + + public int getTextSize() { + return (int) mNumberPaint.getTextSize(); + } + + public void setPadding(int padding) { + mPadding = padding; + } + + public void setDividerColor(int color) { + mDividerPaint.setColor(color); + } + + public int getPadding(){ + return mPadding; + } + + public void setTextColor(int color) { + mNumberPaint.setColor(color); + } + + public int getTextColor() { + return mNumberPaint.getColor(); + } + + public void setCornerSize(int cornerSize) { + mCornerSize = cornerSize; + } + + public int getCornerSize() { + return mCornerSize; + } + + public void setBackgroundColor(int color) { + mBackgroundPaint.setColor(color); + } + + public int getBackgroundColor() { + return mBackgroundPaint.getColor(); + } + + public void start() { + tabAnimation.start(); + } + + public void onDraw(Canvas canvas) { + drawTabs(canvas); + //drawDivider(canvas); + } + + public void run() { + tabAnimation.run(); + } + + public void sync() { + tabAnimation.sync(); + } + + public boolean isRunning(){ + return tabAnimation.isRunning(); + } + +} diff --git a/app/src/main/java/com/xenione/digit/TabDigitEntity.java b/app/src/main/java/com/xenione/digit/TabDigitEntity.java new file mode 100644 index 0000000..fcac886 --- /dev/null +++ b/app/src/main/java/com/xenione/digit/TabDigitEntity.java @@ -0,0 +1,116 @@ +package com.xenione.digit; + +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; + +public class TabDigitEntity { + + private String currentChar,beforChar,nextChar; + + private final Matrix mModelViewMatrix = new Matrix(); + + private final Matrix mModelViewProjectionMatrix = new Matrix(); + + private final Matrix mRotationModelViewMatrix = new Matrix(); + + private final RectF mStartBounds = new RectF(); + + private final RectF mEndBounds = new RectF(); + + private int mAlpha; + + private Matrix mMeasuredMatrixHeight = new Matrix(); + + private Matrix mMeasuredMatrixWidth = new Matrix(); + + private Matrix mProjectionMatrix; + + private int mCornerSize; + + + public TabDigitEntity(String currentChar, String nextChar,Matrix mProjectionMatrix,int mCornerSize) { + this.currentChar = currentChar; + this.beforChar=currentChar; + this.nextChar = nextChar; + this.mProjectionMatrix=mProjectionMatrix; + this.mCornerSize=mCornerSize; + } + + public void measure(int width, int height) { + Rect area = new Rect(-width / 2, 0, width / 2, height / 2); + mStartBounds.set(area); + mEndBounds.set(area); + mEndBounds.offset(0, -height/2); + } + + public int maxWith() { + RectF rect = new RectF(mStartBounds); + Matrix projectionMatrix = new Matrix(); + MatrixHelper.translate(projectionMatrix, mStartBounds.left, -mStartBounds.top, 0); + mMeasuredMatrixWidth.reset(); + mMeasuredMatrixWidth.setConcat(projectionMatrix, MatrixHelper.ROTATE_X_90); + mMeasuredMatrixWidth.mapRect(rect); + return (int) rect.width(); + } + + public int maxHeight() { + RectF rect = new RectF(mStartBounds); + Matrix projectionMatrix = new Matrix(); + mMeasuredMatrixHeight.reset(); + mMeasuredMatrixHeight.setConcat(projectionMatrix, MatrixHelper.ROTATE_X_0); + mMeasuredMatrixHeight.mapRect(rect); + return (int) rect.height(); + } + + public void setChar(String currChar) { + this.currentChar=currChar; + } + + public void next() { + if(currentChar!=nextChar) + currentChar=nextChar; + else + currentChar=beforChar; + } + + public void rotate(int alpha) { + mAlpha = alpha; + MatrixHelper.rotateX(mRotationModelViewMatrix, alpha); + } + + public void draw(Canvas canvas, Rect mTextMeasured,Paint mNumberPaint,Paint mBackgroundPaint) { + //drawBackground(canvas,mBackgroundPaint); + drawText(canvas, mTextMeasured, mNumberPaint); + } + + private void drawBackground(Canvas canvas,Paint mBackgroundPaint) { + canvas.save(); + mModelViewMatrix.set(mRotationModelViewMatrix); + applyTransformation(canvas, mModelViewMatrix); + canvas.drawRoundRect(mStartBounds, mCornerSize, mCornerSize, mBackgroundPaint); + canvas.restore(); + } + + private void drawText(Canvas canvas, Rect mTextMeasured,Paint mNumberPaint) { + canvas.save(); + mModelViewMatrix.set(mRotationModelViewMatrix); + RectF clip = mStartBounds; + if (mAlpha > 90) { + mModelViewMatrix.setConcat(mModelViewMatrix, MatrixHelper.MIRROR_X); + clip = mEndBounds; + } + applyTransformation(canvas, mModelViewMatrix); + canvas.clipRect(clip); + canvas.drawText(currentChar, 0, 1, -mTextMeasured.centerX(), -mTextMeasured.centerY(), mNumberPaint); + canvas.restore(); + } + + private void applyTransformation(Canvas canvas, Matrix matrix) { + mModelViewProjectionMatrix.reset(); + mModelViewProjectionMatrix.setConcat(mProjectionMatrix, matrix); + canvas.concat(mModelViewProjectionMatrix); + } + } diff --git a/app/src/main/java/com/xenione/digit/TabDigit_old.java b/app/src/main/java/com/xenione/digit/TabDigit_old.java new file mode 100644 index 0000000..13156ac --- /dev/null +++ b/app/src/main/java/com/xenione/digit/TabDigit_old.java @@ -0,0 +1,420 @@ +package com.xenione.digit; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; + +import java.util.ArrayList; +import java.util.List; + + +public class TabDigit_old{ + +} +/** + * Created by Eugeni on 16/10/2016. + */ +/*public class TabDigit_old extends View implements Runnable { + + /* + * false: rotate upwards + * true: rotate downwards + */ + /*private boolean mReverseRotation = false; + + private Tab mTopTab; + + private Tab mBottomTab; + + private Tab mMiddleTab; + + private List tabs = new ArrayList<>(3); + + private AbstractTabAnimation tabAnimation; + + private Matrix mProjectionMatrix = new Matrix(); + + private int mCornerSize; + + private Paint mNumberPaint; + + private Paint mDividerPaint; + + private Paint mBackgroundPaint; + + private Rect mTextMeasured = new Rect(); + + private int mPadding = 0; + + private char[] mChars = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + + public TabDigit_old(Context context) { + this(context, null); + } + + public TabDigit_old(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public TabDigit_old(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public TabDigit_old(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context, attrs); + } + + public void init(Context context, AttributeSet attrs) { + + initPaints(); + + int padding = -1; + int textSize = -1; + int cornerSize = -1; + int textColor = 1; + int backgroundColor = 1; + boolean reverseRotation = false; + + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TabDigit, 0, 0); + final int num = ta.getIndexCount(); + for (int i = 0; i < num; i++) { + int attr = ta.getIndex(i); + if (attr == R.styleable.TabDigit_textSize) { + textSize = ta.getDimensionPixelSize(attr, -1); + } else if (attr == R.styleable.TabDigit_padding) { + padding = ta.getDimensionPixelSize(attr, -1); + } else if (attr == R.styleable.TabDigit_cornerSize) { + cornerSize = ta.getDimensionPixelSize(attr, -1); + } else if (attr == R.styleable.TabDigit_textColor) { + textColor = ta.getColor(attr, 1); + } else if (attr == R.styleable.TabDigit_backgroundColor) { + backgroundColor = ta.getColor(attr, 1); + } else if (attr == R.styleable.TabDigit_reverseRotation) { + reverseRotation = ta.getBoolean(attr, false); + } + } + ta.recycle(); + + if (padding > 0) { + mPadding = padding; + } + + if (textSize > 0) { + mNumberPaint.setTextSize(textSize); + } + + if (cornerSize > 0) { + mCornerSize = cornerSize; + } + + if (textColor < 1) { + mNumberPaint.setColor(textColor); + } + + if (backgroundColor < 1) { + mBackgroundPaint.setColor(backgroundColor); + } + + mReverseRotation = reverseRotation; + mReverseRotation = true; + + initTabs(); + } + + private void initPaints() { + mNumberPaint = new Paint(); + mNumberPaint.setAntiAlias(true); + mNumberPaint.setStyle(Paint.Style.FILL_AND_STROKE); + mNumberPaint.setColor(Color.WHITE); + + mDividerPaint = new Paint(); + mDividerPaint.setAntiAlias(true); + mDividerPaint.setStyle(Paint.Style.FILL_AND_STROKE); + mDividerPaint.setColor(Color.WHITE); + mDividerPaint.setStrokeWidth(1); + + mBackgroundPaint = new Paint(); + mBackgroundPaint.setAntiAlias(true); + mBackgroundPaint.setColor(Color.BLACK); + } + + private void initTabs() { + // top Tab + mTopTab = new Tab(); + mTopTab.rotate(180); + tabs.add(mTopTab); + + // bottom Tab + mBottomTab = new Tab(); + tabs.add(mBottomTab); + + // middle Tab + mMiddleTab = new Tab(); + tabs.add(mMiddleTab); + + tabAnimation = mReverseRotation ? new TabAnimationDown(mTopTab, mBottomTab, mMiddleTab) : new TabAnimationUp(mTopTab, mBottomTab, mMiddleTab); + + tabAnimation.initMiddleTab(); + + setInternalChar(0); + } + + public void setChar(int index) { + setInternalChar(index); + invalidate(); + } + + private void setInternalChar(int index) { + for (Tab tab : tabs) { + tab.setChar(index); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + calculateTextSize(mTextMeasured); + + int childWidth = mTextMeasured.width() + mPadding; + int childHeight = mTextMeasured.height() + mPadding; + measureTabs(childWidth, childHeight); + + int maxChildWidth = mMiddleTab.maxWith(); + int maxChildHeight = 2 * mMiddleTab.maxHeight(); + int resolvedWidth = resolveSize(maxChildWidth, widthMeasureSpec); + int resolvedHeight = resolveSize(maxChildHeight, heightMeasureSpec); + + setMeasuredDimension(resolvedWidth, resolvedHeight); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + if (w != oldw || h != oldh) { + setupProjectionMatrix(); + } + } + + private void setupProjectionMatrix() { + mProjectionMatrix.reset(); + int centerY = getHeight() / 2; + int centerX = getWidth() / 2; + MatrixHelper.translate(mProjectionMatrix, centerX, -centerY, 0); + } + + private void measureTabs(int width, int height) { + for (Tab tab : tabs) { + tab.measure(width, height); + } + } + + private void drawTabs(Canvas canvas) { + for (Tab tab : tabs) { + tab.draw(canvas); + } + } + + private void drawDivider(Canvas canvas) { + canvas.save(); + canvas.concat(mProjectionMatrix); + canvas.drawLine(-canvas.getWidth() / 2, 0, canvas.getWidth() / 2, 0, mDividerPaint); + canvas.restore(); + } + + private void calculateTextSize(Rect rect) { + mNumberPaint.getTextBounds("8", 0, 1, rect); + } + + public void setTextSize(int size) { + mNumberPaint.setTextSize(size); + requestLayout(); + } + + public int getTextSize() { + return (int) mNumberPaint.getTextSize(); + } + + public void setPadding(int padding) { + mPadding = padding; + requestLayout(); + } + + *//** + * Sets chars that are going to be displayed. + * Note: That only one digit is allow per character. + * + * @param chars + *//* + public void setChars(char[] chars) { + mChars = chars; + } + + public char[] getChars() { + return mChars; + } + + + public void setDividerColor(int color) { + mDividerPaint.setColor(color); + } + + public int getPadding(){ + return mPadding; + } + + public void setTextColor(int color) { + mNumberPaint.setColor(color); + } + + public int getTextColor() { + return mNumberPaint.getColor(); + } + + public void setCornerSize(int cornerSize) { + mCornerSize = cornerSize; + invalidate(); + } + + public int getCornerSize() { + return mCornerSize; + } + + public void setBackgroundColor(int color) { + mBackgroundPaint.setColor(color); + } + + public int getBackgroundColor() { + return mBackgroundPaint.getColor(); + } + + public void start() { + tabAnimation.start(); + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + drawTabs(canvas); + drawDivider(canvas); + ViewCompat.postOnAnimationDelayed(this, this, 40); + } + + @Override + public void run() { + tabAnimation.run(); + invalidate(); + } + + public void sync() { + tabAnimation.sync(); + invalidate(); + } + + public class Tab { + + private final Matrix mModelViewMatrix = new Matrix(); + + private final Matrix mModelViewProjectionMatrix = new Matrix(); + + private final Matrix mRotationModelViewMatrix = new Matrix(); + + private final RectF mStartBounds = new RectF(); + + private final RectF mEndBounds = new RectF(); + + private int mCurrIndex = 0; + + private int mAlpha; + + private Matrix mMeasuredMatrixHeight = new Matrix(); + + private Matrix mMeasuredMatrixWidth = new Matrix(); + + + public void measure(int width, int height) { + Rect area = new Rect(-width / 2, 0, width / 2, height / 2); + mStartBounds.set(area); + mEndBounds.set(area); + mEndBounds.offset(0, -height / 2); + } + + public int maxWith() { + RectF rect = new RectF(mStartBounds); + Matrix projectionMatrix = new Matrix(); + MatrixHelper.translate(projectionMatrix, mStartBounds.left, -mStartBounds.top, 0); + mMeasuredMatrixWidth.reset(); + mMeasuredMatrixWidth.setConcat(projectionMatrix, MatrixHelper.ROTATE_X_90); + mMeasuredMatrixWidth.mapRect(rect); + return (int) rect.width(); + } + + public int maxHeight() { + RectF rect = new RectF(mStartBounds); + Matrix projectionMatrix = new Matrix(); + mMeasuredMatrixHeight.reset(); + mMeasuredMatrixHeight.setConcat(projectionMatrix, MatrixHelper.ROTATE_X_0); + mMeasuredMatrixHeight.mapRect(rect); + return (int) rect.height(); + } + + public void setChar(int index) { + mCurrIndex = index > mChars.length ? 0 : index; + } + + public void next() { + mCurrIndex++; + if (mCurrIndex >= mChars.length) { + mCurrIndex = 0; + } + } + + public void rotate(int alpha) { + mAlpha = alpha; + MatrixHelper.rotateX(mRotationModelViewMatrix, alpha); + } + + public void draw(Canvas canvas) { + drawBackground(canvas); + drawText(canvas); + } + + private void drawBackground(Canvas canvas) { + canvas.save(); + mModelViewMatrix.set(mRotationModelViewMatrix); + applyTransformation(canvas, mModelViewMatrix); + canvas.drawRoundRect(mStartBounds, mCornerSize, mCornerSize, mBackgroundPaint); + canvas.restore(); + } + + private void drawText(Canvas canvas) { + canvas.save(); + mModelViewMatrix.set(mRotationModelViewMatrix); + RectF clip = mStartBounds; + if (mAlpha > 90) { + mModelViewMatrix.setConcat(mModelViewMatrix, MatrixHelper.MIRROR_X); + clip = mEndBounds; + } + applyTransformation(canvas, mModelViewMatrix); + canvas.clipRect(clip); + canvas.drawText(Character.toString(mChars[mCurrIndex]), 0, 1, -mTextMeasured.centerX(), -mTextMeasured.centerY(), mNumberPaint); + canvas.restore(); + } + + private void applyTransformation(Canvas canvas, Matrix matrix) { + mModelViewProjectionMatrix.reset(); + mModelViewProjectionMatrix.setConcat(mProjectionMatrix, matrix); + canvas.concat(mModelViewProjectionMatrix); + } + } + +}*/ diff --git a/app/src/main/res/layout/activity_count_down.xml b/app/src/main/res/layout/activity_count_down.xml deleted file mode 100644 index 3509b84..0000000 --- a/app/src/main/res/layout/activity_count_down.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_counting.xml b/app/src/main/res/layout/activity_counting.xml deleted file mode 100644 index 3509b84..0000000 --- a/app/src/main/res/layout/activity_counting.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_alter.xml b/app/src/main/res/layout/fragment_alter.xml index 025597a..b78ce8e 100644 --- a/app/src/main/res/layout/fragment_alter.xml +++ b/app/src/main/res/layout/fragment_alter.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".fragment.AlterFragment"> + tools:context=".fragment.handup.HandUpDefaultFragment"> + + + + + +