Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(500)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsGroupView.java

Issue 1540663002: Prettier "last synced" times on the recent tabs page. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: happened just now Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser.ntp; 5 package org.chromium.chrome.browser.ntp;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.content.res.Resources; 8 import android.content.res.Resources;
9 import android.graphics.drawable.LevelListDrawable; 9 import android.graphics.drawable.LevelListDrawable;
10 import android.util.AttributeSet; 10 import android.util.AttributeSet;
11 import android.view.View; 11 import android.view.View;
12 import android.widget.ImageView; 12 import android.widget.ImageView;
13 import android.widget.RelativeLayout; 13 import android.widget.RelativeLayout;
14 import android.widget.TextView; 14 import android.widget.TextView;
15 15
16 import org.chromium.base.ApiCompatibilityUtils; 16 import org.chromium.base.ApiCompatibilityUtils;
17 import org.chromium.chrome.R; 17 import org.chromium.chrome.R;
18 import org.chromium.chrome.browser.ntp.ForeignSessionHelper.ForeignSession; 18 import org.chromium.chrome.browser.ntp.ForeignSessionHelper.ForeignSession;
19 import org.chromium.chrome.browser.widget.TintedDrawable; 19 import org.chromium.chrome.browser.widget.TintedDrawable;
20 import org.chromium.ui.base.DeviceFormFactor; 20 import org.chromium.ui.base.DeviceFormFactor;
21 21
22 import java.util.concurrent.TimeUnit;
23
24 /** 22 /**
25 * Header view shown above each group of items on the Recent Tabs page. Shows th e name of the 23 * Header view shown above each group of items on the Recent Tabs page. Shows th e name of the
26 * group (e.g. "Recently closed" or "Jim's Laptop"), an icon, last synced time, and a button to 24 * group (e.g. "Recently closed" or "Jim's Laptop"), an icon, last synced time, and a button to
27 * expand or collapse the group. 25 * expand or collapse the group.
28 */ 26 */
29 public class RecentTabsGroupView extends RelativeLayout { 27 public class RecentTabsGroupView extends RelativeLayout {
30 28
31 /** Drawable levels for the device type icon and the expand/collapse arrow. */ 29 /** Drawable levels for the device type icon and the expand/collapse arrow. */
32 private static final int DRAWABLE_LEVEL_COLLAPSED = 0; 30 private static final int DRAWABLE_LEVEL_COLLAPSED = 0;
33 private static final int DRAWABLE_LEVEL_EXPANDED = 1; 31 private static final int DRAWABLE_LEVEL_EXPANDED = 1;
34 32
35 private ImageView mDeviceIcon; 33 private ImageView mDeviceIcon;
36 private ImageView mExpandCollapseIcon; 34 private ImageView mExpandCollapseIcon;
37 private TextView mDeviceLabel; 35 private TextView mDeviceLabel;
38 private TextView mTimeLabel; 36 private TextView mTimeLabel;
39 private long mInitializationTimestamp;
40 private int mDeviceLabelExpandedColor; 37 private int mDeviceLabelExpandedColor;
41 private int mDeviceLabelCollapsedColor; 38 private int mDeviceLabelCollapsedColor;
42 private int mTimeLabelExpandedColor; 39 private int mTimeLabelExpandedColor;
43 private int mTimeLabelCollapsedColor; 40 private int mTimeLabelCollapsedColor;
44 41
45 /** 42 /**
46 * Constructor for inflating from XML. 43 * Constructor for inflating from XML.
47 * 44 *
48 * @param context The context this view will work in. 45 * @param context The context this view will work in.
49 * @param attrs The attribute set for this view. 46 * @param attrs The attribute set for this view.
(...skipping 24 matching lines...) Expand all
74 TintedDrawable.constructTintedDrawable(getResources(), R.drawabl e.ic_expanded)); 71 TintedDrawable.constructTintedDrawable(getResources(), R.drawabl e.ic_expanded));
75 TintedDrawable collapse = 72 TintedDrawable collapse =
76 TintedDrawable.constructTintedDrawable(getResources(), R.drawabl e.ic_collapsed); 73 TintedDrawable.constructTintedDrawable(getResources(), R.drawabl e.ic_collapsed);
77 collapse.setTint( 74 collapse.setTint(
78 ApiCompatibilityUtils.getColorStateList(getResources(), R.color. blue_mode_tint)); 75 ApiCompatibilityUtils.getColorStateList(getResources(), R.color. blue_mode_tint));
79 collapseIcon.addLevel(DRAWABLE_LEVEL_EXPANDED, DRAWABLE_LEVEL_EXPANDED, collapse); 76 collapseIcon.addLevel(DRAWABLE_LEVEL_EXPANDED, DRAWABLE_LEVEL_EXPANDED, collapse);
80 mExpandCollapseIcon.setImageDrawable(collapseIcon); 77 mExpandCollapseIcon.setImageDrawable(collapseIcon);
81 } 78 }
82 79
83 /** 80 /**
84 * Initialize the state of the group view. Should be called immediatly after object creation.
85 *
86 * @param initializationTimestamp The timestamp to compute the time since la st session sync.
87 */
88 public void initialize(long initializationTimestamp) {
89 mInitializationTimestamp = initializationTimestamp;
90 }
91
92 /**
93 * Configures the view for currently open tabs. 81 * Configures the view for currently open tabs.
94 * 82 *
95 * @param isExpanded Whether the view is expanded or collapsed. 83 * @param isExpanded Whether the view is expanded or collapsed.
96 */ 84 */
97 public void configureForCurrentlyOpenTabs(boolean isExpanded) { 85 public void configureForCurrentlyOpenTabs(boolean isExpanded) {
98 mDeviceIcon.setVisibility(View.VISIBLE); 86 mDeviceIcon.setVisibility(View.VISIBLE);
99 mDeviceIcon.setImageResource(DeviceFormFactor.isTablet(getContext()) 87 mDeviceIcon.setImageResource(DeviceFormFactor.isTablet(getContext())
100 ? R.drawable.recent_tablet : R.drawable.recent_phone); 88 ? R.drawable.recent_tablet : R.drawable.recent_phone);
101 String title = getResources().getString(R.string.recent_tabs_this_device ); 89 String title = getResources().getString(R.string.recent_tabs_this_device );
102 mDeviceLabel.setText(title); 90 mDeviceLabel.setText(title);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 int level = isExpanded ? DRAWABLE_LEVEL_EXPANDED : DRAWABLE_LEVEL_COLLAP SED; 152 int level = isExpanded ? DRAWABLE_LEVEL_EXPANDED : DRAWABLE_LEVEL_COLLAP SED;
165 mExpandCollapseIcon.getDrawable().setLevel(level); 153 mExpandCollapseIcon.getDrawable().setLevel(level);
166 mDeviceIcon.setActivated(isExpanded); 154 mDeviceIcon.setActivated(isExpanded);
167 155
168 mDeviceLabel.setTextColor(isExpanded 156 mDeviceLabel.setTextColor(isExpanded
169 ? mDeviceLabelExpandedColor 157 ? mDeviceLabelExpandedColor
170 : mDeviceLabelCollapsedColor); 158 : mDeviceLabelCollapsedColor);
171 mTimeLabel.setTextColor(isExpanded ? mTimeLabelExpandedColor : mTimeLabe lCollapsedColor); 159 mTimeLabel.setTextColor(isExpanded ? mTimeLabelExpandedColor : mTimeLabe lCollapsedColor);
172 } 160 }
173 161
174 private String getTimeString(ForeignSession session) { 162 private CharSequence getTimeString(ForeignSession session) {
175 long sessionModifiedTimeSeconds = 163 long timeDeltaMs = System.currentTimeMillis() - session.modifiedTime;
176 TimeUnit.SECONDS.convert(session.modifiedTime, TimeUnit.MILLISEC ONDS); 164 if (timeDeltaMs < 0) timeDeltaMs = 0;
177 long timeDelta = mInitializationTimestamp - sessionModifiedTimeSeconds;
178 timeDelta = timeDelta > 0 ? timeDelta : 0;
179 165
180 long daysElapsed = timeDelta / (24L * 60L * 60L); 166 int daysElapsed = (int) (timeDeltaMs / (24L * 60L * 60L * 1000L));
181 long hoursElapsed = timeDelta / (60L * 60L); 167 int hoursElapsed = (int) (timeDeltaMs / (60L * 60L * 1000L));
182 long minutesElapsed = timeDelta / 60L; 168 int minutesElapsed = (int) (timeDeltaMs / (60L * 1000L));
183 169
184 Resources resources = getContext().getResources(); 170 Resources res = getResources();
171 String relativeTime;
185 if (daysElapsed > 0L) { 172 if (daysElapsed > 0L) {
186 return resources.getString(R.string.ntp_recent_tabs_last_synced_days , daysElapsed); 173 relativeTime = res.getQuantityString(R.plurals.n_days_ago, daysElaps ed, daysElapsed);
187 } else if (hoursElapsed > 0L) { 174 } else if (hoursElapsed > 0L) {
188 return resources.getString(R.string.ntp_recent_tabs_last_synced_hour s, hoursElapsed); 175 relativeTime = res.getQuantityString(R.plurals.n_hours_ago, hoursEla psed, hoursElapsed);
189 } else if (minutesElapsed > 0L) { 176 } else if (minutesElapsed > 0L) {
190 return resources.getString( 177 relativeTime = res.getQuantityString(R.plurals.n_minutes_ago, minute sElapsed,
191 R.string.ntp_recent_tabs_last_synced_minutes, minutesElapsed ); 178 minutesElapsed);
192 } else { 179 } else {
193 return resources.getString(R.string.ntp_recent_tabs_last_synced_just _now); 180 relativeTime = res.getString(R.string.just_now);
194 } 181 }
182
183 return getResources().getString(R.string.ntp_recent_tabs_last_synced, re lativeTime);
195 } 184 }
196 185
197 /** 186 /**
198 * Shows or hides the time label (e.g. "Last synced: just now") and adjusts the positions of the 187 * Shows or hides the time label (e.g. "Last synced: just now") and adjusts the positions of the
199 * icon and device label. In particular, the icon and device label are top-a ligned when the time 188 * icon and device label. In particular, the icon and device label are top-a ligned when the time
200 * is visible, but are vertically centered when the time is gone. 189 * is visible, but are vertically centered when the time is gone.
201 */ 190 */
202 private void setTimeLabelVisibility(int visibility) { 191 private void setTimeLabelVisibility(int visibility) {
203 if (mTimeLabel.getVisibility() == visibility) return; 192 if (mTimeLabel.getVisibility() == visibility) return;
204 mTimeLabel.setVisibility(visibility); 193 mTimeLabel.setVisibility(visibility);
205 if (visibility == View.GONE) { 194 if (visibility == View.GONE) {
206 replaceRule(mDeviceIcon, ALIGN_PARENT_TOP, CENTER_VERTICAL); 195 replaceRule(mDeviceIcon, ALIGN_PARENT_TOP, CENTER_VERTICAL);
207 replaceRule(mDeviceLabel, ALIGN_PARENT_TOP, CENTER_VERTICAL); 196 replaceRule(mDeviceLabel, ALIGN_PARENT_TOP, CENTER_VERTICAL);
208 } else { 197 } else {
209 replaceRule(mDeviceIcon, CENTER_VERTICAL, ALIGN_PARENT_TOP); 198 replaceRule(mDeviceIcon, CENTER_VERTICAL, ALIGN_PARENT_TOP);
210 replaceRule(mDeviceLabel, CENTER_VERTICAL, ALIGN_PARENT_TOP); 199 replaceRule(mDeviceLabel, CENTER_VERTICAL, ALIGN_PARENT_TOP);
211 } 200 }
212 } 201 }
213 202
214 private static void replaceRule(View view, int oldRule, int newRule) { 203 private static void replaceRule(View view, int oldRule, int newRule) {
215 RelativeLayout.LayoutParams lp = ((RelativeLayout.LayoutParams) view.get LayoutParams()); 204 RelativeLayout.LayoutParams lp = ((RelativeLayout.LayoutParams) view.get LayoutParams());
216 lp.addRule(oldRule, 0); 205 lp.addRule(oldRule, 0);
217 lp.addRule(newRule); 206 lp.addRule(newRule);
218 } 207 }
219 } 208 }
OLDNEW
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698