88import android .os .Bundle ;
99import android .os .Handler ;
1010import android .preference .PreferenceManager ;
11+ import android .util .TypedValue ;
1112import android .view .GestureDetector ;
1213import android .view .MotionEvent ;
1314import android .view .View ;
15+ import android .view .ViewTreeObserver ;
1416import android .view .WindowManager ;
1517import android .widget .FrameLayout ;
1618import android .widget .TextView ;
1921import java .util .Calendar ;
2022import java .util .Date ;
2123
22- public class MainActivity extends Activity implements View .OnTouchListener , GestureDetector .OnGestureListener , Runnable {
24+ public class MainActivity extends Activity implements View .OnTouchListener , GestureDetector .OnGestureListener , Runnable , ViewTreeObserver . OnGlobalLayoutListener {
2325 private boolean lightTheme = false ;
2426 private boolean activityStarted = false ;
2527 private Handler handler ;
@@ -32,11 +34,13 @@ public class MainActivity extends Activity implements View.OnTouchListener, Gest
3234
3335 private SimpleDateFormat timeFormat ;
3436 private SimpleDateFormat dateFormat ;
35-
37+ private View decorView ;
38+ private FrameLayout mainLayout ;
3639 private TextView timeView ;
3740 private TextView dateView ;
41+ private int screenWidthDp ;
3842
39- private Calendar calendar = Calendar .getInstance ();
43+ private final Calendar calendar = Calendar .getInstance ();
4044
4145 @ SuppressLint ({"ClickableViewAccessibility" , "SimpleDateFormat" })
4246 @ Override
@@ -49,18 +53,16 @@ protected void onCreate(Bundle savedInstanceState) {
4953 setTheme (R .style .Theme_DeskClockLite_Light );
5054 else
5155 setTheme (R .style .Theme_DeskClockLite );
52-
56+ getWindow ().addFlags (WindowManager .LayoutParams .FLAG_KEEP_SCREEN_ON
57+ | WindowManager .LayoutParams .FLAG_FULLSCREEN );
58+ decorView = getWindow ().getDecorView ();
5359 setContentView (R .layout .activity_main );
60+
5461 mGestureDetector = new GestureDetector (this );
5562 mGestureDetector .setIsLongpressEnabled (true );
56- FrameLayout mainLayout = findViewById (R .id .mainLayout );
57- mainLayout .setLongClickable (true );
63+ mainLayout = findViewById (R .id .mainLayout );
5864 mainLayout .setOnTouchListener (this );
59-
60- if (Build .VERSION .SDK_INT < 16 )
61- getWindow ().setFlags (WindowManager .LayoutParams .FLAG_FULLSCREEN , WindowManager .LayoutParams .FLAG_FULLSCREEN );
62-
63- getWindow ().addFlags (WindowManager .LayoutParams .FLAG_KEEP_SCREEN_ON );
65+ mainLayout .getViewTreeObserver ().addOnGlobalLayoutListener (this );
6466
6567 timeView = findViewById (R .id .time );
6668 dateView = findViewById (R .id .date );
@@ -69,6 +71,8 @@ protected void onCreate(Bundle savedInstanceState) {
6971 dateFormat = new SimpleDateFormat (getString (R .string .date_template ));
7072
7173 handler = new Handler ();
74+
75+
7276 }
7377
7478 @ Override
@@ -99,8 +103,18 @@ protected void onResume() {
99103 hideSystemUI ();
100104 }
101105
106+ private float dp2px (int value ) {
107+ return TypedValue .applyDimension (TypedValue .COMPLEX_UNIT_PX , value , getResources ().getDisplayMetrics ());
108+ }
109+
110+ private int px2dp (float value ) {
111+ final float scale = getResources ().getDisplayMetrics ().density ;
112+ return (int ) (value / scale );
113+ }
114+
115+
102116 private void hideSystemUI () {
103- View decorView = getWindow (). getDecorView ();
117+
104118 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .JELLY_BEAN ) {
105119 // Set the content to appear under the system bars so that the
106120 // content doesn't resize when the system bars hide and show.
@@ -113,6 +127,7 @@ private void hideSystemUI() {
113127 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .KITKAT ) {
114128 visibility |= View .SYSTEM_UI_FLAG_IMMERSIVE_STICKY ;
115129 }
130+
116131 decorView .setSystemUiVisibility (visibility );
117132 }
118133 }
@@ -153,7 +168,6 @@ public boolean onDown(MotionEvent e) {
153168
154169 @ Override
155170 public void onShowPress (MotionEvent e ) {
156-
157171 }
158172
159173 @ Override
@@ -186,6 +200,8 @@ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float ve
186200 @ SuppressLint ("ClickableViewAccessibility" )
187201 @ Override
188202 public boolean onTouch (View v , MotionEvent event ) {
203+ if (event .getAction () == MotionEvent .ACTION_UP )
204+ hideSystemUI ();
189205 return mGestureDetector .onTouchEvent (event );
190206 }
191207
@@ -195,21 +211,74 @@ public void run() {
195211 String time = timeFormat .format (new Date ());
196212 String baseDate = dateFormat .format (new Date ());
197213 int weekDay = calendar .get (Calendar .DAY_OF_WEEK );
198- if (lastTime == null || !lastTime .equals (time )) {
199- timeView .setText (time );
200- lastTime = time ;
201- }
202214 if (lastWeekDay != weekDay ) {
203215 lastWeekDay = weekDay ;
204216 lastWeekDayText = getWeekDayText (weekDay );
205217 }
206218 String date = baseDate + " " + lastWeekDayText ;
219+
220+ if (activityStarted )
221+ handler .postDelayed (this , 100 );
222+
223+ if (lastTime == null || !lastTime .equals (time )) {
224+ timeView .setText (time );
225+ lastTime = time ;
226+ }
207227 if (lastDate == null || !lastDate .equals (date )) {
208228 dateView .setText (date );
209229 lastDate = date ;
210230 }
211- if (activityStarted )
212- handler .postDelayed (this , 100 );
213231 }
214232 }
233+
234+ @ Override
235+ public void onGlobalLayout () {
236+ int newScreenWidthDp = px2dp (mainLayout .getMeasuredWidth ());
237+ if (newScreenWidthDp != screenWidthDp ) {
238+ screenWidthDp = newScreenWidthDp ;
239+ int timeSize ;
240+ int dateSize ;
241+ int dateMarginDp ;
242+ if (screenWidthDp >= 1600 ) {
243+ timeSize = 360 ;
244+ dateSize = 48 ;
245+ dateMarginDp = 56 ;
246+ } else if (screenWidthDp >= 1280 ) {
247+ timeSize = 288 ;
248+ dateSize = 34 ;
249+ dateMarginDp = 40 ;
250+ } else if (screenWidthDp >= 800 ) {
251+ timeSize = 192 ;
252+ dateSize = 20 ;
253+ dateMarginDp = 24 ;
254+ } else if (screenWidthDp >= 600 ) {
255+ timeSize = 144 ;
256+ dateSize = 20 ;
257+ dateMarginDp = 24 ;
258+ } else if (screenWidthDp >= 400 ) {
259+ timeSize = 96 ;
260+ dateSize = 18 ;
261+ dateMarginDp = 16 ;
262+ } else if (screenWidthDp >= 320 ) {
263+ timeSize = 80 ;
264+ dateSize = 18 ;
265+ dateMarginDp = 16 ;
266+ } else if (screenWidthDp >= 240 ) {
267+ timeSize = 60 ;
268+ dateSize = 16 ;
269+ dateMarginDp = 16 ;
270+ } else {
271+ timeSize = 44 ;
272+ dateSize = 12 ;
273+ dateMarginDp = 24 ;
274+ }
275+ int dateMargin = (int ) dp2px (dateMarginDp );
276+ timeView .setTextSize (timeSize );
277+ dateView .setTextSize (dateSize );
278+ FrameLayout .LayoutParams layoutParams = (FrameLayout .LayoutParams ) dateView .getLayoutParams ();
279+ layoutParams .setMargins (dateMargin , dateMargin , dateMargin , dateMargin );
280+ dateView .setLayoutParams (layoutParams );
281+ }
282+ }
283+
215284}
0 commit comments