From ff75e39b569fb119c58a2b4f013d8a62cc725c75 Mon Sep 17 00:00:00 2001 From: Live Channels Team Date: Tue, 16 Jan 2018 13:03:26 -0800 Subject: Project import generated by Copybara. PiperOrigin-RevId: 182099521 Change-Id: I213983755c98da36ab2cff3f7cfa494e1a1f082c --- src/com/android/tv/MainActivity.java | 1 + src/com/android/tv/SetupPassthroughActivity.java | 1 + src/com/android/tv/TvFeatures.java | 1 + src/com/android/tv/data/epg/EpgFetcherImpl.java | 43 +++++++---- src/com/android/tv/data/epg/EpgReader.java | 3 +- src/com/android/tv/guide/ProgramTableAdapter.java | 1 + src/com/android/tv/onboarding/WelcomeFragment.java | 90 +++++++++++++++++++++- .../tv/receiver/PackageIntentsReceiver.java | 2 + src/com/android/tv/tuner/TunerInputController.java | 2 + .../tv/ui/sidepanel/DeveloperOptionFragment.java | 1 + 10 files changed, 125 insertions(+), 20 deletions(-) (limited to 'src/com') diff --git a/src/com/android/tv/MainActivity.java b/src/com/android/tv/MainActivity.java index 17adeb7d..22ee9321 100644 --- a/src/com/android/tv/MainActivity.java +++ b/src/com/android/tv/MainActivity.java @@ -95,6 +95,7 @@ import com.android.tv.dvr.data.ScheduledRecording; import com.android.tv.dvr.recorder.ConflictChecker; import com.android.tv.dvr.ui.DvrStopRecordingFragment; import com.android.tv.dvr.ui.DvrUiHelper; + import com.android.tv.menu.Menu; import com.android.tv.onboarding.OnboardingActivity; import com.android.tv.parental.ContentRatingsManager; diff --git a/src/com/android/tv/SetupPassthroughActivity.java b/src/com/android/tv/SetupPassthroughActivity.java index 3ca5be77..40d38118 100644 --- a/src/com/android/tv/SetupPassthroughActivity.java +++ b/src/com/android/tv/SetupPassthroughActivity.java @@ -33,6 +33,7 @@ import com.android.tv.data.ChannelDataManager; import com.android.tv.data.ChannelDataManager.Listener; import com.android.tv.data.epg.EpgFetcher; import com.android.tv.data.epg.EpgInputWhiteList; + import com.android.tv.util.SetupUtils; import com.android.tv.util.TvInputManagerHelper; import com.android.tv.util.Utils; diff --git a/src/com/android/tv/TvFeatures.java b/src/com/android/tv/TvFeatures.java index 81cc576b..64141e8c 100644 --- a/src/com/android/tv/TvFeatures.java +++ b/src/com/android/tv/TvFeatures.java @@ -38,6 +38,7 @@ import com.android.tv.common.feature.TestableFeature; import com.android.tv.common.util.PermissionUtils; + /** * List of {@link Feature} for the Live TV App. * diff --git a/src/com/android/tv/data/epg/EpgFetcherImpl.java b/src/com/android/tv/data/epg/EpgFetcherImpl.java index 59839593..fbbb0dda 100644 --- a/src/com/android/tv/data/epg/EpgFetcherImpl.java +++ b/src/com/android/tv/data/epg/EpgFetcherImpl.java @@ -54,6 +54,8 @@ import com.android.tv.data.ChannelDataManager; import com.android.tv.data.ChannelLogoFetcher; import com.android.tv.data.Lineup; import com.android.tv.data.Program; + + import com.android.tv.perf.EventNames; import com.android.tv.perf.PerformanceMonitor; import com.android.tv.perf.TimerEvent; @@ -113,7 +115,6 @@ public class EpgFetcherImpl implements EpgFetcher { private final ChannelDataManager mChannelDataManager; private final EpgReader mEpgReader; private final PerformanceMonitor mPerformanceMonitor; - private final EpgInputWhiteList mEpgInputWhiteList; private FetchAsyncTask mFetchTask; private FetchDuringScanHandler mFetchDuringScanHandler; private long mEpgTimeStamp; @@ -135,7 +136,6 @@ public class EpgFetcherImpl implements EpgFetcher { PerformanceMonitor performanceMonitor = tvSingletons.getPerformanceMonitor(); EpgReader epgReader = tvSingletons.providesEpgReader().get(); Clock clock = tvSingletons.getClock(); - EpgInputWhiteList epgInputWhiteList = new EpgInputWhiteList(tvSingletons.getRemoteConfig()); int routineIntervalMs = (int) RemoteConfigUtils.getRemoteConfig( @@ -147,8 +147,8 @@ public class EpgFetcherImpl implements EpgFetcher { epgReader, performanceMonitor, clock, - routineIntervalMs, - epgInputWhiteList); + routineIntervalMs + ); } @VisibleForTesting @@ -158,8 +158,8 @@ public class EpgFetcherImpl implements EpgFetcher { EpgReader epgReader, PerformanceMonitor performanceMonitor, Clock clock, - long routineIntervalMs, - EpgInputWhiteList epgInputWhiteList) { + long routineIntervalMs + ) { mContext = context; mChannelDataManager = channelDataManager; mEpgReader = epgReader; @@ -169,7 +169,6 @@ public class EpgFetcherImpl implements EpgFetcher { routineIntervalMs <= 0 ? TimeUnit.HOURS.toMillis(DEFAULT_ROUTINE_INTERVAL_HOUR) : TimeUnit.HOURS.toMillis(routineIntervalMs); - mEpgInputWhiteList = epgInputWhiteList; mEpgDataExpiredTimeLimitMs = routineIntervalMs * 2; mFastFetchDurationSec = FAST_FETCH_DURATION_SEC + routineIntervalMs / 1000; } @@ -306,6 +305,7 @@ public class EpgFetcherImpl implements EpgFetcher { } @MainThread + @Override public void stopFetchingJob() { if (DEBUG) Log.d(TAG, "Try to stop routinely fetching job..."); if (mFetchTask != null) { @@ -351,7 +351,6 @@ public class EpgFetcherImpl implements EpgFetcher { if (DEBUG) Log.d(TAG, "Cannot start routine service: scanning channels."); return false; } - return true; } @@ -511,7 +510,6 @@ public class EpgFetcherImpl implements EpgFetcher { return numbers.size(); } - @VisibleForTesting class FetchAsyncTask extends AsyncTask { private final JobService mService; @@ -539,18 +537,29 @@ public class EpgFetcherImpl implements EpgFetcher { Integer builtInResult = fetchEpgForBuiltInTuner(); boolean anyCloudEpgFailure = false; boolean anyCloudEpgSuccess = false; - if (builtInResult == null || builtInResult == REASON_NO_BUILT_IN_CHANNELS) { - return anyCloudEpgFailure - ? ((Integer) REASON_CLOUD_EPG_FAILURE) - : anyCloudEpgSuccess ? null : builtInResult; - } else { - return builtInResult; - } + return builtInResult; } finally { TrafficStats.setThreadStatsTag(oldTag); } } + private Set getExistingChannelsFor(String inputId) { + Set result = new HashSet<>(); + try (Cursor cursor = + mContext.getContentResolver() + .query( + TvContract.buildChannelsUriForInput(inputId), + Channel.PROJECTION, + null, + null, + null)) { + while (cursor.moveToNext()) { + result.add(Channel.fromCursor(cursor)); + } + return result; + } + } + private Integer fetchEpgForBuiltInTuner() { try { Integer failureReason = prepareFetchEpg(false); @@ -737,6 +746,8 @@ public class EpgFetcherImpl implements EpgFetcher { onFinishFetchDuringScan(); } break; + default: + // do nothing } } diff --git a/src/com/android/tv/data/epg/EpgReader.java b/src/com/android/tv/data/epg/EpgReader.java index 4e4177c4..9c881439 100644 --- a/src/com/android/tv/data/epg/EpgReader.java +++ b/src/com/android/tv/data/epg/EpgReader.java @@ -23,7 +23,6 @@ import com.android.tv.data.Channel; import com.android.tv.data.Lineup; import com.android.tv.data.Program; import com.android.tv.dvr.data.SeriesInfo; -//import com.google.auto.value.AutoValue; import java.util.Collection; import java.util.List; import java.util.Map; @@ -34,7 +33,7 @@ import java.util.Set; public interface EpgReader { /** Value class that holds a EpgChannelId and its corresponding Channel */ - //@AutoValue + // TODO(b/72052568): Get autovalue to work in aosp abstract class EpgChannel { public static EpgChannel createEpgChannel(Channel channel, String epgChannelId) { return new AutoValue_EpgReader_EpgChannel(channel, epgChannelId); diff --git a/src/com/android/tv/guide/ProgramTableAdapter.java b/src/com/android/tv/guide/ProgramTableAdapter.java index 1a1ba36c..c77673a2 100644 --- a/src/com/android/tv/guide/ProgramTableAdapter.java +++ b/src/com/android/tv/guide/ProgramTableAdapter.java @@ -58,6 +58,7 @@ import com.android.tv.dvr.DvrDataManager; import com.android.tv.dvr.DvrManager; import com.android.tv.dvr.data.ScheduledRecording; import com.android.tv.guide.ProgramManager.TableEntriesUpdatedListener; + import com.android.tv.parental.ParentalControlSettings; import com.android.tv.ui.HardwareLayerAnimatorListenerAdapter; import com.android.tv.util.ImageCache; diff --git a/src/com/android/tv/onboarding/WelcomeFragment.java b/src/com/android/tv/onboarding/WelcomeFragment.java index 150e0997..92b56e8d 100644 --- a/src/com/android/tv/onboarding/WelcomeFragment.java +++ b/src/com/android/tv/onboarding/WelcomeFragment.java @@ -16,6 +16,8 @@ package com.android.tv.onboarding; +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS; + import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; @@ -24,11 +26,18 @@ import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v17.leanback.app.OnboardingFragment; +import android.text.Editable; +import android.text.TextWatcher; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.view.View.AccessibilityDelegate; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.Button; import android.widget.ImageView; +import android.widget.TextView; import com.android.tv.R; import com.android.tv.common.ui.setup.SetupActionHelper; import com.android.tv.common.ui.setup.animation.SetupAnimationHelper; @@ -37,7 +46,7 @@ import java.util.List; /** A fragment for the onboarding welcome screen. */ public class WelcomeFragment extends OnboardingFragment { - public static final String ACTION_CATEGORY = "comgoogle.android.tv.onboarding.WelcomeFragment"; + public static final String ACTION_CATEGORY = "com.android.tv.onboarding.WelcomeFragment"; public static final int ACTION_NEXT = 1; private static final long START_DELAY_CLOUD_MS = 33; @@ -576,9 +585,14 @@ public class WelcomeFragment extends OnboardingFragment { private ImageView mTvContentView; private ImageView mArrowView; + private TextView mTitleView; + private Button mStartButton; + private View mPagingIndicator; + private Animator mAnimator; private boolean mLogoAnimationFinished; + private boolean mTitleChanged; public WelcomeFragment() { setExitTransition( @@ -600,13 +614,84 @@ public class WelcomeFragment extends OnboardingFragment { mPageDescriptions = getResources().getStringArray(R.array.welcome_page_descriptions); } } - @Nullable @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); setLogoResourceId(R.drawable.splash_logo); + mTitleView = view.findViewById(android.support.v17.leanback.R.id.title); + mPagingIndicator = view.findViewById(android.support.v17.leanback.R.id.page_indicator); + mStartButton = view.findViewById(android.support.v17.leanback.R.id.button_start); + + mStartButton.setAccessibilityDelegate(new AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { + int type = event.getEventType(); + if (type == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED + || type == AccessibilityEvent.TYPE_VIEW_FOCUSED) { + if (!mTitleChanged || mTitleView.isAccessibilityFocused()) { + // Skip the event before the title is accessibility focused to avoid race + // conditions + return; + } + } + super.onInitializeAccessibilityEvent(host, event); + } + }); + + mPagingIndicator.setAccessibilityDelegate(new AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { + int type = event.getEventType(); + if (type == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED + || type == AccessibilityEvent.TYPE_VIEW_FOCUSED) { + if (!mTitleChanged || mTitleView.isAccessibilityFocused()) { + // Skip the event before the title is accessibility focused to avoid race + // conditions + return; + } + } + super.onInitializeAccessibilityEvent(host, event); + } + }); + + mTitleView.setAccessibilityDelegate(new AccessibilityDelegate() { + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + if (action == ACTION_CLEAR_ACCESSIBILITY_FOCUS) { + if (!mTitleChanged || mTitleView.isAccessibilityFocused()) { + // Skip the event before the title is accessibility focused to avoid race + // conditions + return false; + } + } + return super.performAccessibilityAction(host, action, args); + } + }); + + mTitleView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + mTitleChanged = false; + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + if (!mTitleView.isAccessibilityFocused()) { + mTitleView.performAccessibilityAction( + AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null); + } else { + mTitleView.sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); + } + mTitleChanged = true; + } + }); return view; } @@ -746,6 +831,7 @@ public class WelcomeFragment extends OnboardingFragment { if (mAnimator != null) { mAnimator.cancel(); } + mTitleChanged = false; mArrowView.setVisibility(View.GONE); // TV screen hiding animator. Animator hideAnimator = diff --git a/src/com/android/tv/receiver/PackageIntentsReceiver.java b/src/com/android/tv/receiver/PackageIntentsReceiver.java index 7ff67b50..3958f6bf 100644 --- a/src/com/android/tv/receiver/PackageIntentsReceiver.java +++ b/src/com/android/tv/receiver/PackageIntentsReceiver.java @@ -22,7 +22,9 @@ import android.content.Intent; import android.net.Uri; import android.util.Log; import com.android.tv.Starter; +import com.android.tv.TvFeatures; import com.android.tv.TvSingletons; + import com.android.tv.util.Partner; /** A class for handling the broadcast intents from PackageManager. */ diff --git a/src/com/android/tv/tuner/TunerInputController.java b/src/com/android/tv/tuner/TunerInputController.java index f395949d..02611bbf 100644 --- a/src/com/android/tv/tuner/TunerInputController.java +++ b/src/com/android/tv/tuner/TunerInputController.java @@ -51,6 +51,8 @@ import com.android.tv.TvApplication; import com.android.tv.TvSingletons; import com.android.tv.common.BuildConfig; import com.android.tv.common.util.SystemPropertiesProxy; + + import com.android.tv.tuner.setup.BaseTunerSetupActivity; import com.android.tv.tuner.util.TunerInputInfoUtils; import java.text.ParseException; diff --git a/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java b/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java index 9d3b2450..dd42a728 100644 --- a/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java +++ b/src/com/android/tv/ui/sidepanel/DeveloperOptionFragment.java @@ -30,6 +30,7 @@ import com.android.tv.TvSingletons; import com.android.tv.common.CommonPreferences; import com.android.tv.common.feature.CommonFeatures; import com.android.tv.common.util.CommonUtils; + import java.util.ArrayList; import java.util.List; -- cgit v1.2.3