Merge remote-tracking branch 'origin/master'
22
.travis.yml
|
@ -11,29 +11,9 @@ android:
|
||||||
- android-25
|
- android-25
|
||||||
|
|
||||||
# Additional components
|
# Additional components
|
||||||
- extra-android-support
|
|
||||||
- extra-android-m2repository
|
- extra-android-m2repository
|
||||||
- extra-google-m2repository
|
|
||||||
|
|
||||||
# Emulators
|
script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest
|
||||||
- sys-img-armeabi-v7a-android-21
|
|
||||||
- sys-img-armeabi-v7a-android-19
|
|
||||||
- sys-img-armeabi-v7a-android-15
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- ADB_INSTALL_TIMEOUT=8 # minutes (2 by default)
|
|
||||||
- GRADLE_OPTS=-Xmx512m # give gradle more memory since it seem to fail otherwise
|
|
||||||
matrix:
|
|
||||||
- ANDROID_TARGET=android-21 ANDROID_ABI=armeabi-v7a
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI
|
|
||||||
- emulator -avd test -no-skin -no-audio -no-window &
|
|
||||||
- android-wait-for-emulator
|
|
||||||
- adb shell input keyevent 82 &
|
|
||||||
|
|
||||||
script: ./gradlew --info build connectedCheck
|
|
||||||
|
|
||||||
licenses:
|
licenses:
|
||||||
- '.+'
|
- '.+'
|
||||||
|
|
|
@ -32,6 +32,9 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
testCompile 'junit:junit:4.12'
|
testCompile 'junit:junit:4.12'
|
||||||
|
testCompile 'org.mockito:mockito-core:1.10.19'
|
||||||
|
testCompile 'org.json:json:20160810'
|
||||||
|
|
||||||
compile 'com.android.support:appcompat-v7:25.1.0'
|
compile 'com.android.support:appcompat-v7:25.1.0'
|
||||||
compile 'com.android.support:support-v4:25.1.0'
|
compile 'com.android.support:support-v4:25.1.0'
|
||||||
compile 'com.android.support:design:25.1.0'
|
compile 'com.android.support:design:25.1.0'
|
||||||
|
@ -45,8 +48,5 @@ dependencies {
|
||||||
compile 'com.google.code.gson:gson:2.4'
|
compile 'com.google.code.gson:gson:2.4'
|
||||||
compile 'com.nononsenseapps:filepicker:3.0.0'
|
compile 'com.nononsenseapps:filepicker:3.0.0'
|
||||||
compile 'ch.acra:acra:4.9.0'
|
compile 'ch.acra:acra:4.9.0'
|
||||||
compile 'com.devbrackets.android:exomedia:3.1.1'
|
compile 'com.google.android.exoplayer:exoplayer:r2.3.1'
|
||||||
testCompile 'junit:junit:4.12'
|
|
||||||
testCompile 'org.mockito:mockito-core:1.10.19'
|
|
||||||
testCompile 'org.json:json:20160810'
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,24 +51,7 @@
|
||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleInstance"
|
android:launchMode="singleInstance"
|
||||||
android:theme="@style/PlayerTheme">
|
android:theme="@style/PlayerTheme"/>
|
||||||
<intent-filter>
|
|
||||||
<action android:name="org.schabi.newpipe.exoplayer.action.VIEW" />
|
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
|
|
||||||
<data android:scheme="http" />
|
|
||||||
<data android:scheme="https" />
|
|
||||||
<data android:scheme="content" />
|
|
||||||
<data android:scheme="asset" />
|
|
||||||
<data android:scheme="file" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
|
|
||||||
<service
|
|
||||||
android:name=".player.BackgroundPlayer"
|
|
||||||
android:exported="false"
|
|
||||||
android:label="@string/background_player_name" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".settings.SettingsActivity"
|
android:name=".settings.SettingsActivity"
|
||||||
|
@ -180,7 +163,7 @@
|
||||||
|
|
||||||
<activity android:name=".PopupActivity"
|
<activity android:name=".PopupActivity"
|
||||||
android:theme="@android:style/Theme.NoDisplay"
|
android:theme="@android:style/Theme.NoDisplay"
|
||||||
android:label="NewPipe Popup mode">
|
android:label="@string/popup_mode_share_menu_title">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
|
||||||
|
|
|
@ -51,6 +51,7 @@ import org.schabi.newpipe.extractor.stream_info.AudioStream;
|
||||||
import org.schabi.newpipe.extractor.stream_info.StreamInfo;
|
import org.schabi.newpipe.extractor.stream_info.StreamInfo;
|
||||||
import org.schabi.newpipe.extractor.stream_info.VideoStream;
|
import org.schabi.newpipe.extractor.stream_info.VideoStream;
|
||||||
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
||||||
|
import org.schabi.newpipe.player.AbstractPlayer;
|
||||||
import org.schabi.newpipe.player.BackgroundPlayer;
|
import org.schabi.newpipe.player.BackgroundPlayer;
|
||||||
import org.schabi.newpipe.player.ExoPlayerActivity;
|
import org.schabi.newpipe.player.ExoPlayerActivity;
|
||||||
import org.schabi.newpipe.player.PlayVideoActivity;
|
import org.schabi.newpipe.player.PlayVideoActivity;
|
||||||
|
@ -59,6 +60,7 @@ import org.schabi.newpipe.report.ErrorActivity;
|
||||||
import org.schabi.newpipe.util.NavStack;
|
import org.schabi.newpipe.util.NavStack;
|
||||||
import org.schabi.newpipe.util.PermissionHelper;
|
import org.schabi.newpipe.util.PermissionHelper;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
|
|
||||||
import static android.app.Activity.RESULT_OK;
|
import static android.app.Activity.RESULT_OK;
|
||||||
|
@ -331,10 +333,12 @@ public class VideoItemDetailFragment extends Fragment {
|
||||||
// so, I can notify the service through a broadcast, but the problem is
|
// so, I can notify the service through a broadcast, but the problem is
|
||||||
// when I click in another video, another thumbnail will be load, and will
|
// when I click in another video, another thumbnail will be load, and will
|
||||||
// notify again, so I send the videoUrl and compare with the service's url
|
// notify again, so I send the videoUrl and compare with the service's url
|
||||||
ActivityCommunicator.getCommunicator().backgroundPlayerThumbnail = streamThumbnail;
|
if (getContext() != null) {
|
||||||
Intent intent = new Intent(PopupVideoPlayer.InternalListener.ACTION_UPDATE_THUMB);
|
ActivityCommunicator.getCommunicator().backgroundPlayerThumbnail = streamThumbnail;
|
||||||
intent.putExtra(PopupVideoPlayer.VIDEO_URL, info.webpage_url);
|
Intent intent = new Intent(AbstractPlayer.ACTION_UPDATE_THUMB);
|
||||||
getContext().sendBroadcast(intent);
|
intent.putExtra(AbstractPlayer.VIDEO_URL, info.webpage_url);
|
||||||
|
getContext().sendBroadcast(intent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,13 +392,15 @@ public class VideoItemDetailFragment extends Fragment {
|
||||||
if (streamThumbnail != null)
|
if (streamThumbnail != null)
|
||||||
ActivityCommunicator.getCommunicator().backgroundPlayerThumbnail = streamThumbnail;
|
ActivityCommunicator.getCommunicator().backgroundPlayerThumbnail = streamThumbnail;
|
||||||
|
|
||||||
VideoStream selectedVideoStream = info.video_streams.get(selectedStreamId);
|
|
||||||
Intent i = new Intent(activity, PopupVideoPlayer.class);
|
Intent i = new Intent(activity, PopupVideoPlayer.class);
|
||||||
Toast.makeText(activity, "Starting in popup mode", Toast.LENGTH_SHORT).show();
|
Toast.makeText(activity, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show();
|
||||||
i.putExtra(PopupVideoPlayer.VIDEO_TITLE, info.title)
|
i.putExtra(AbstractPlayer.VIDEO_TITLE, info.title)
|
||||||
.putExtra(PopupVideoPlayer.STREAM_URL, selectedVideoStream.url)
|
.putExtra(AbstractPlayer.CHANNEL_NAME, info.uploader)
|
||||||
.putExtra(PopupVideoPlayer.CHANNEL_NAME, info.uploader)
|
.putExtra(AbstractPlayer.VIDEO_URL, info.webpage_url)
|
||||||
.putExtra(PopupVideoPlayer.VIDEO_URL, info.webpage_url);
|
.putExtra(AbstractPlayer.INDEX_SEL_VIDEO_STREAM, selectedStreamId)
|
||||||
|
.putExtra(AbstractPlayer.VIDEO_STREAMS_LIST, new ArrayList<>(info.video_streams));
|
||||||
|
if (info.start_position > 0) i.putExtra(AbstractPlayer.START_POSITION, info.start_position * 1000);
|
||||||
|
|
||||||
activity.startService(i);
|
activity.startService(i);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -784,47 +790,31 @@ public class VideoItemDetailFragment extends Fragment {
|
||||||
builder.create().show();
|
builder.create().show();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (PreferenceManager.getDefaultSharedPreferences(activity)
|
Intent intent;
|
||||||
.getBoolean(activity.getString(R.string.use_exoplayer_key), false)) {
|
boolean useOldPlayer = PreferenceManager
|
||||||
|
.getDefaultSharedPreferences(activity)
|
||||||
// TODO: Fix this mess
|
.getBoolean(activity.getString(R.string.use_old_player_key), false)
|
||||||
if (streamThumbnail != null)
|
|| (Build.VERSION.SDK_INT < 16);
|
||||||
ActivityCommunicator.getCommunicator().backgroundPlayerThumbnail = streamThumbnail;
|
if (!useOldPlayer) {
|
||||||
// exo player
|
// ExoPlayer
|
||||||
|
if (streamThumbnail != null) ActivityCommunicator.getCommunicator().backgroundPlayerThumbnail = streamThumbnail;
|
||||||
if(info.dashMpdUrl != null && !info.dashMpdUrl.isEmpty()) {
|
intent = new Intent(activity, ExoPlayerActivity.class)
|
||||||
// try dash
|
.putExtra(AbstractPlayer.VIDEO_TITLE, info.title)
|
||||||
Intent intent = new Intent(activity, ExoPlayerActivity.class)
|
.putExtra(AbstractPlayer.VIDEO_URL, info.webpage_url)
|
||||||
.setData(Uri.parse(info.dashMpdUrl));
|
.putExtra(AbstractPlayer.CHANNEL_NAME, info.uploader)
|
||||||
//.putExtra(ExoPlayerActivity.CONTENT_TYPE_EXTRA, Util.TYPE_DASH);
|
.putExtra(AbstractPlayer.INDEX_SEL_VIDEO_STREAM, actionBarHandler.getSelectedVideoStream())
|
||||||
startActivity(intent);
|
.putExtra(AbstractPlayer.VIDEO_STREAMS_LIST, new ArrayList<>(info.video_streams));
|
||||||
} else if((info.audio_streams != null && !info.audio_streams.isEmpty()) &&
|
if (info.start_position > 0) intent.putExtra(AbstractPlayer.START_POSITION, info.start_position * 1000);
|
||||||
(info.video_only_streams != null && !info.video_only_streams.isEmpty())) {
|
|
||||||
// try smooth streaming
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//default streaming
|
|
||||||
Intent intent = new Intent(activity, ExoPlayerActivity.class)
|
|
||||||
.setDataAndType(Uri.parse(selectedVideoStream.url),
|
|
||||||
MediaFormat.getMimeById(selectedVideoStream.format))
|
|
||||||
|
|
||||||
.putExtra(ExoPlayerActivity.VIDEO_TITLE, info.title)
|
|
||||||
.putExtra(ExoPlayerActivity.CHANNEL_NAME, info.uploader);
|
|
||||||
//.putExtra(ExoPlayerActivity.CONTENT_TYPE_EXTRA, Util.TYPE_OTHER);
|
|
||||||
|
|
||||||
activity.startActivity(intent); // HERE !!!
|
|
||||||
}
|
|
||||||
//-------------
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Internal Player
|
// Internal Player
|
||||||
Intent intent = new Intent(activity, PlayVideoActivity.class)
|
intent = new Intent(activity, PlayVideoActivity.class)
|
||||||
.putExtra(PlayVideoActivity.VIDEO_TITLE, info.title)
|
.putExtra(PlayVideoActivity.VIDEO_TITLE, info.title)
|
||||||
.putExtra(PlayVideoActivity.STREAM_URL, selectedVideoStream.url)
|
.putExtra(PlayVideoActivity.STREAM_URL, selectedVideoStream.url)
|
||||||
.putExtra(PlayVideoActivity.VIDEO_URL, info.webpage_url)
|
.putExtra(PlayVideoActivity.VIDEO_URL, info.webpage_url)
|
||||||
.putExtra(PlayVideoActivity.START_POSITION, info.start_position);
|
.putExtra(PlayVideoActivity.START_POSITION, info.start_position);
|
||||||
activity.startActivity(intent); //also HERE !!!
|
|
||||||
}
|
}
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
activity.startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------
|
// --------------------------------------------
|
||||||
|
|
|
@ -26,7 +26,6 @@ import org.schabi.newpipe.ActivityCommunicator;
|
||||||
import org.schabi.newpipe.BuildConfig;
|
import org.schabi.newpipe.BuildConfig;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.detail.VideoItemDetailActivity;
|
import org.schabi.newpipe.detail.VideoItemDetailActivity;
|
||||||
import org.schabi.newpipe.detail.VideoItemDetailFragment;
|
|
||||||
import org.schabi.newpipe.util.NavStack;
|
import org.schabi.newpipe.util.NavStack;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -343,7 +342,7 @@ public class BackgroundPlayer extends Service /*implements MediaPlayer.OnPrepare
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NotificationCompat.Action pauseButton = new NotificationCompat.Action.Builder
|
NotificationCompat.Action pauseButton = new NotificationCompat.Action.Builder
|
||||||
(R.drawable.ic_pause_white_24dp, "Pause", playPI).build();
|
(R.drawable.ic_pause_white, "Pause", playPI).build();
|
||||||
*/
|
*/
|
||||||
|
|
||||||
PendingIntent playPI = PendingIntent.getBroadcast(owner, noteID,
|
PendingIntent playPI = PendingIntent.getBroadcast(owner, noteID,
|
||||||
|
@ -465,7 +464,7 @@ public class BackgroundPlayer extends Service /*implements MediaPlayer.OnPrepare
|
||||||
RemoteViews views = getContentView(), bigViews = getBigContentView();
|
RemoteViews views = getContentView(), bigViews = getBigContentView();
|
||||||
int imageSrc;
|
int imageSrc;
|
||||||
if(isPlaying) {
|
if(isPlaying) {
|
||||||
imageSrc = R.drawable.ic_pause_white_24dp;
|
imageSrc = R.drawable.ic_pause_white;
|
||||||
} else {
|
} else {
|
||||||
imageSrc = R.drawable.ic_play_circle_filled_white_24dp;
|
imageSrc = R.drawable.ic_play_circle_filled_white_24dp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,220 +1,574 @@
|
||||||
package org.schabi.newpipe.player;
|
package org.schabi.newpipe.player;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.media.AudioManager;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.view.GestureDetector;
|
||||||
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.PopupMenu;
|
||||||
import android.widget.SeekBar;
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
import com.devbrackets.android.exomedia.listener.OnCompletionListener;
|
import android.widget.Toast;
|
||||||
import com.devbrackets.android.exomedia.listener.OnPreparedListener;
|
|
||||||
import com.devbrackets.android.exomedia.listener.VideoControlsVisibilityListener;
|
|
||||||
import com.devbrackets.android.exomedia.ui.widget.EMVideoView;
|
|
||||||
import com.devbrackets.android.exomedia.ui.widget.VideoControlsMobile;
|
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
import org.schabi.newpipe.util.NavStack;
|
||||||
|
import org.schabi.newpipe.util.PermissionHelper;
|
||||||
|
import org.schabi.newpipe.util.ThemeHelper;
|
||||||
|
|
||||||
public class ExoPlayerActivity extends Activity implements OnPreparedListener, OnCompletionListener {
|
/**
|
||||||
private static final String TAG = "ExoPlayerActivity";
|
* Activity Player implementing AbstractPlayer
|
||||||
private static final boolean DEBUG = false;
|
*
|
||||||
private EMVideoView videoView;
|
* @author mauriciocolli
|
||||||
private CustomVideoControls videoControls;
|
*/
|
||||||
|
public class ExoPlayerActivity extends Activity {
|
||||||
|
private static final String TAG = ".ExoPlayerActivity";
|
||||||
|
private static final boolean DEBUG = AbstractPlayer.DEBUG;
|
||||||
|
|
||||||
public static final String VIDEO_TITLE = "video_title";
|
private AudioManager audioManager;
|
||||||
public static final String CHANNEL_NAME = "channel_name";
|
private BroadcastReceiver broadcastReceiver;
|
||||||
private String videoTitle = "";
|
private GestureDetector gestureDetector;
|
||||||
private volatile String channelName = "";
|
|
||||||
private int lastPosition;
|
private final Runnable hideUiRunnable = new Runnable() {
|
||||||
private boolean isFinished;
|
@Override
|
||||||
|
public void run() {
|
||||||
|
hideSystemUi();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
private boolean activityPaused;
|
||||||
|
|
||||||
|
private AbstractPlayerImpl playerImpl;
|
||||||
|
|
||||||
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Activity LifeCycle
|
||||||
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
if (DEBUG) Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
|
||||||
|
ThemeHelper.setTheme(this, false);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) getWindow().setStatusBarColor(Color.BLACK);
|
||||||
|
setVolumeControlStream(AudioManager.STREAM_MUSIC);
|
||||||
|
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
|
||||||
|
|
||||||
|
if (getIntent() == null) {
|
||||||
|
Toast.makeText(this, R.string.general_error, Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
setContentView(R.layout.activity_exo_player);
|
setContentView(R.layout.activity_exo_player);
|
||||||
videoView = (EMVideoView) findViewById(R.id.emVideoView);
|
playerImpl = new AbstractPlayerImpl();
|
||||||
|
playerImpl.setup(findViewById(android.R.id.content));
|
||||||
|
initReceiver();
|
||||||
|
playerImpl.handleIntent(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart() {
|
protected void onNewIntent(Intent intent) {
|
||||||
super.onStart();
|
if (DEBUG) Log.d(TAG, "onNewIntent() called with: intent = [" + intent + "]");
|
||||||
Intent intent = getIntent();
|
super.onNewIntent(intent);
|
||||||
videoTitle = intent.getStringExtra(VIDEO_TITLE);
|
playerImpl.handleIntent(intent);
|
||||||
channelName = intent.getStringExtra(CHANNEL_NAME);
|
|
||||||
videoView.setOnPreparedListener(this);
|
|
||||||
videoView.setOnCompletionListener(this);
|
|
||||||
videoView.setVideoURI(intent.getData());
|
|
||||||
|
|
||||||
videoControls = new CustomVideoControls(this);
|
|
||||||
videoControls.setTitle(videoTitle);
|
|
||||||
videoControls.setSubTitle(channelName);
|
|
||||||
|
|
||||||
//We don't need these button until the playlist or queue is implemented
|
|
||||||
videoControls.setNextButtonRemoved(true);
|
|
||||||
videoControls.setPreviousButtonRemoved(true);
|
|
||||||
|
|
||||||
videoControls.setVisibilityListener(new VideoControlsVisibilityListener() {
|
|
||||||
@Override
|
|
||||||
public void onControlsShown() {
|
|
||||||
if (DEBUG) Log.d(TAG, "------------ onControlsShown() called");
|
|
||||||
showSystemUi();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onControlsHidden() {
|
|
||||||
if (DEBUG) Log.d(TAG, "------------ onControlsHidden() called");
|
|
||||||
hideSystemUi();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
videoView.setControls(videoControls);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPrepared() {
|
public void onBackPressed() {
|
||||||
if (DEBUG) Log.d(TAG, "onPrepared() called");
|
if (DEBUG) Log.d(TAG, "onBackPressed() called");
|
||||||
videoView.start();
|
super.onBackPressed();
|
||||||
|
if (playerImpl.isStartedFromNewPipe()) NavStack.getInstance().openDetailActivity(this, playerImpl.getVideoUrl(), 0);
|
||||||
|
if (playerImpl.isPlaying()) playerImpl.getPlayer().setPlayWhenReady(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCompletion() {
|
protected void onStop() {
|
||||||
if (DEBUG) Log.d(TAG, "onCompletion() called");
|
super.onStop();
|
||||||
// videoView.getVideoControls().setButtonListener();
|
if (DEBUG) Log.d(TAG, "onStop() called");
|
||||||
//videoView.restart();
|
activityPaused = true;
|
||||||
videoControls.setRewindButtonRemoved(true);
|
playerImpl.destroy();
|
||||||
videoControls.setFastForwardButtonRemoved(true);
|
playerImpl.setVideoStartPos((int) playerImpl.getPlayer().getCurrentPosition());
|
||||||
isFinished = true;
|
|
||||||
videoControls.getSeekBar().setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
videoView.stopPlayback();
|
|
||||||
lastPosition = videoView.getCurrentPosition();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
if (lastPosition > 0) videoView.seekTo(lastPosition);
|
if (DEBUG) Log.d(TAG, "onResume() called");
|
||||||
|
if (activityPaused) {
|
||||||
|
//playerImpl.getPlayer().setPlayWhenReady(true);
|
||||||
|
playerImpl.getPlayPauseButton().setImageResource(R.drawable.ic_play_arrow_white);
|
||||||
|
playerImpl.initPlayer();
|
||||||
|
playerImpl.playVideo(playerImpl.getSelectedStreamUri(), false);
|
||||||
|
activityPaused = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
videoView.stopPlayback();
|
if (DEBUG) Log.d(TAG, "onDestroy() called");
|
||||||
|
if (playerImpl != null) playerImpl.destroy();
|
||||||
|
if (broadcastReceiver != null) unregisterReceiver(broadcastReceiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Init
|
||||||
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
private void initReceiver() {
|
||||||
|
if (DEBUG) Log.d(TAG, "initReceiver() called");
|
||||||
|
broadcastReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
if (DEBUG) Log.d(TAG, "onReceive() called with: context = [" + context + "], intent = [" + intent + "]");
|
||||||
|
switch (intent.getAction()) {
|
||||||
|
case AbstractPlayer.ACTION_UPDATE_THUMB:
|
||||||
|
playerImpl.onUpdateThumbnail(intent);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
IntentFilter intentFilter = new IntentFilter();
|
||||||
|
intentFilter.addAction(AbstractPlayer.ACTION_UPDATE_THUMB);
|
||||||
|
registerReceiver(broadcastReceiver, intentFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Utils
|
||||||
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
private void showSystemUi() {
|
private void showSystemUi() {
|
||||||
if (DEBUG) Log.d(TAG, "showSystemUi() called");
|
if (DEBUG) Log.d(TAG, "showSystemUi() called");
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||||
|
getWindow().getDecorView().setSystemUiVisibility(
|
||||||
|
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||||
|
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||||
|
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||||
|
);
|
||||||
|
} else getWindow().getDecorView().setSystemUiVisibility(0);
|
||||||
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void hideSystemUi() {
|
private void hideSystemUi() {
|
||||||
if (DEBUG) Log.d(TAG, "hideSystemUi() called");
|
if (DEBUG) Log.d(TAG, "hideSystemUi() called");
|
||||||
if (android.os.Build.VERSION.SDK_INT >= 17) {
|
if (android.os.Build.VERSION.SDK_INT >= 16) {
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
|
||||||
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||||
| View.SYSTEM_UI_FLAG_IMMERSIVE
|
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
||||||
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
|
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||||
|
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) visibility |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
|
||||||
|
getWindow().getDecorView().setSystemUiVisibility(visibility);
|
||||||
}
|
}
|
||||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class CustomVideoControls extends VideoControlsMobile {
|
private void toggleOrientation() {
|
||||||
protected static final int FAST_FORWARD_REWIND_AMOUNT = 8000;
|
setRequestedOrientation(getResources().getDisplayMetrics().heightPixels > getResources().getDisplayMetrics().widthPixels
|
||||||
|
? ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
|
||||||
|
: ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
|
||||||
|
}
|
||||||
|
|
||||||
protected ImageButton fastForwardButton;
|
///////////////////////////////////////////////////////////////////////////
|
||||||
protected ImageButton rewindButton;
|
|
||||||
|
|
||||||
public CustomVideoControls(Context context) {
|
@SuppressWarnings({"unused", "WeakerAccess"})
|
||||||
super(context);
|
private class AbstractPlayerImpl extends AbstractPlayer {
|
||||||
|
private TextView titleTextView;
|
||||||
|
private TextView channelTextView;
|
||||||
|
private TextView volumeTextView;
|
||||||
|
private TextView brightnessTextView;
|
||||||
|
private ImageButton repeatButton;
|
||||||
|
|
||||||
|
private ImageButton screenRotationButton;
|
||||||
|
private ImageButton playPauseButton;
|
||||||
|
|
||||||
|
AbstractPlayerImpl() {
|
||||||
|
super("AbstractPlayerImpl" + ExoPlayerActivity.TAG, ExoPlayerActivity.this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getLayoutResource() {
|
public void initViews(View rootView) {
|
||||||
return R.layout.exomedia_custom_controls;
|
super.initViews(rootView);
|
||||||
|
this.titleTextView = (TextView) rootView.findViewById(R.id.titleTextView);
|
||||||
|
this.channelTextView = (TextView) rootView.findViewById(R.id.channelTextView);
|
||||||
|
this.volumeTextView = (TextView) rootView.findViewById(R.id.volumeTextView);
|
||||||
|
this.brightnessTextView = (TextView) rootView.findViewById(R.id.brightnessTextView);
|
||||||
|
this.repeatButton = (ImageButton) rootView.findViewById(R.id.repeatButton);
|
||||||
|
|
||||||
|
this.screenRotationButton = (ImageButton) rootView.findViewById(R.id.screenRotationButton);
|
||||||
|
this.playPauseButton = (ImageButton) rootView.findViewById(R.id.playPauseButton);
|
||||||
|
|
||||||
|
// Due to a bug on lower API, lets set the alpha instead of using a drawable
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) repeatButton.setImageAlpha(77);
|
||||||
|
else { //noinspection deprecation
|
||||||
|
repeatButton.setAlpha(77);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void retrieveViews() {
|
public void initListeners() {
|
||||||
super.retrieveViews();
|
super.initListeners();
|
||||||
rewindButton = (ImageButton) findViewById(R.id.exomedia_controls_frewind_btn);
|
|
||||||
fastForwardButton = (ImageButton) findViewById(R.id.exomedia_controls_fforward_btn);
|
MySimpleOnGestureListener listener = new MySimpleOnGestureListener();
|
||||||
|
gestureDetector = new GestureDetector(context, listener);
|
||||||
|
gestureDetector.setIsLongpressEnabled(false);
|
||||||
|
playerImpl.getRootView().setOnTouchListener(listener);
|
||||||
|
|
||||||
|
repeatButton.setOnClickListener(this);
|
||||||
|
playPauseButton.setOnClickListener(this);
|
||||||
|
screenRotationButton.setOnClickListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerListeners() {
|
public void handleIntent(Intent intent) {
|
||||||
super.registerListeners();
|
super.handleIntent(intent);
|
||||||
rewindButton.setOnClickListener(new OnClickListener() {
|
titleTextView.setText(getVideoTitle());
|
||||||
@Override
|
channelTextView.setText(getChannelName());
|
||||||
public void onClick(View v) {
|
|
||||||
onRewindClicked();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
fastForwardButton.setOnClickListener(new OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
onFastForwardClicked();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean onFastForwardClicked() {
|
|
||||||
if (videoView == null) return false;
|
|
||||||
|
|
||||||
int newPosition = videoView.getCurrentPosition() + FAST_FORWARD_REWIND_AMOUNT;
|
|
||||||
if (newPosition > seekBar.getMax()) newPosition = seekBar.getMax();
|
|
||||||
|
|
||||||
performSeek(newPosition);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean onRewindClicked() {
|
|
||||||
if (videoView == null) return false;
|
|
||||||
|
|
||||||
int newPosition = videoView.getCurrentPosition() - FAST_FORWARD_REWIND_AMOUNT;
|
|
||||||
if (newPosition < 0) newPosition = 0;
|
|
||||||
|
|
||||||
performSeek(newPosition);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFastForwardButtonRemoved(boolean removed) {
|
public void playVideo(Uri videoURI, boolean autoPlay) {
|
||||||
fastForwardButton.setVisibility(removed ? View.GONE : View.VISIBLE);
|
super.playVideo(videoURI, autoPlay);
|
||||||
|
playPauseButton.setImageResource(autoPlay ? R.drawable.ic_pause_white : R.drawable.ic_play_arrow_white);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRewindButtonRemoved(boolean removed) {
|
public void onFullScreenButtonClicked() {
|
||||||
rewindButton.setVisibility(removed ? View.GONE : View.VISIBLE);
|
if (DEBUG) Log.d(TAG, "onFullScreenButtonClicked() called");
|
||||||
|
if (playerImpl.getPlayer() == null) return;
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
|
||||||
|
&& !PermissionHelper.checkSystemAlertWindowPermission(ExoPlayerActivity.this)) {
|
||||||
|
Toast.makeText(ExoPlayerActivity.this, R.string.msg_popup_permission, Toast.LENGTH_LONG).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Intent i = new Intent(ExoPlayerActivity.this, PopupVideoPlayer.class);
|
||||||
|
i.putExtra(AbstractPlayer.VIDEO_TITLE, getVideoTitle())
|
||||||
|
.putExtra(AbstractPlayer.CHANNEL_NAME, getChannelName())
|
||||||
|
.putExtra(AbstractPlayer.VIDEO_URL, getVideoUrl())
|
||||||
|
.putExtra(AbstractPlayer.INDEX_SEL_VIDEO_STREAM, getSelectedIndexStream())
|
||||||
|
.putExtra(AbstractPlayer.VIDEO_STREAMS_LIST, getVideoStreamsList())
|
||||||
|
.putExtra(AbstractPlayer.START_POSITION, ((int) getPlayer().getCurrentPosition()));
|
||||||
|
context.startService(i);
|
||||||
|
((View) getControlAnimationView().getParent()).setVisibility(View.GONE);
|
||||||
|
if (playerImpl.isPlaying()) playerImpl.getPlayer().setPlayWhenReady(false);
|
||||||
|
ExoPlayerActivity.this.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPlayPauseClick() {
|
@SuppressWarnings("deprecation")
|
||||||
super.onPlayPauseClick();
|
public void onRepeatClicked() {
|
||||||
if (videoView == null) return;
|
super.onRepeatClicked();
|
||||||
if (DEBUG) Log.d(TAG, "onPlayPauseClick() called" + videoView.getDuration() + " position= " + videoView.getCurrentPosition());
|
if (DEBUG) Log.d(TAG, "onRepeatClicked() called");
|
||||||
if (isFinished) {
|
switch (getCurrentRepeatMode()) {
|
||||||
videoView.restart();
|
case REPEAT_DISABLED:
|
||||||
setRewindButtonRemoved(false);
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) repeatButton.setImageAlpha(77);
|
||||||
setFastForwardButtonRemoved(false);
|
else repeatButton.setAlpha(77);
|
||||||
isFinished = false;
|
|
||||||
seekBar.setEnabled(true);
|
break;
|
||||||
|
case REPEAT_ONE:
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) repeatButton.setImageAlpha(255);
|
||||||
|
else repeatButton.setAlpha(255);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case REPEAT_ALL:
|
||||||
|
// Waiting :)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void performSeek(int newPosition) {
|
@Override
|
||||||
internalListener.onSeekEnded(newPosition);
|
public void onClick(View v) {
|
||||||
|
super.onClick(v);
|
||||||
|
if (v.getId() == repeatButton.getId()) onRepeatClicked();
|
||||||
|
else if (v.getId() == playPauseButton.getId()) onVideoPlayPause();
|
||||||
|
else if (v.getId() == screenRotationButton.getId()) onScreenRotationClicked();
|
||||||
|
|
||||||
|
if (getCurrentState() != STATE_COMPLETED) {
|
||||||
|
animateView(playerImpl.getControlsRoot(), true, 300, 0, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (getCurrentState() == STATE_PLAYING && !playerImpl.isQualityMenuVisible()) {
|
||||||
|
animateView(playerImpl.getControlsRoot(), false, 300, DEFAULT_CONTROLS_HIDE_TIME, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SeekBar getSeekBar() {
|
private void onScreenRotationClicked() {
|
||||||
return seekBar;
|
if (DEBUG) Log.d(TAG, "onScreenRotationClicked() called");
|
||||||
|
toggleOrientation();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onVideoPlayPause() {
|
||||||
|
super.onVideoPlayPause();
|
||||||
|
if (getPlayer().getPlayWhenReady()) {
|
||||||
|
animateView(playPauseButton, false, 80, 0, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
playPauseButton.setImageResource(R.drawable.ic_pause_white);
|
||||||
|
animateView(playPauseButton, true, 200, 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
animateView(playPauseButton, false, 80, 0, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
playPauseButton.setImageResource(R.drawable.ic_play_arrow_white);
|
||||||
|
animateView(playPauseButton, true, 200, 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
super.onStopTrackingTouch(seekBar);
|
||||||
|
if (playerImpl.wasPlaying()) {
|
||||||
|
hideSystemUi();
|
||||||
|
playerImpl.getControlsRoot().setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDismiss(PopupMenu menu) {
|
||||||
|
super.onDismiss(menu);
|
||||||
|
if (isPlaying()) animateView(getControlsRoot(), false, 500, 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError() {
|
||||||
|
Toast.makeText(context, "Failed to play this video", Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
// States
|
||||||
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoading() {
|
||||||
|
super.onLoading();
|
||||||
|
playPauseButton.setImageResource(R.drawable.ic_pause_white);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPaused() {
|
||||||
|
super.onPaused();
|
||||||
|
animateView(playPauseButton, true, 100, 0);
|
||||||
|
showSystemUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPausedSeek() {
|
||||||
|
super.onPausedSeek();
|
||||||
|
animateView(playPauseButton, false, 100, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlaying() {
|
||||||
|
super.onPlaying();
|
||||||
|
animateView(playPauseButton, true, 500, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCompleted() {
|
||||||
|
if (getCurrentRepeatMode() == RepeatMode.REPEAT_ONE) {
|
||||||
|
playPauseButton.setImageResource(R.drawable.ic_pause_white);
|
||||||
|
} else {
|
||||||
|
showSystemUi();
|
||||||
|
animateView(playPauseButton, false, 0, 0, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
playPauseButton.setImageResource(R.drawable.ic_replay_white);
|
||||||
|
animateView(playPauseButton, true, 300, 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
super.onCompleted();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Utils
|
||||||
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void animateView(View view, boolean enterOrExit, long duration, long delay, final Runnable execOnEnd, boolean hideUi) {
|
||||||
|
//if (execOnEnd == null) playerImpl.setDefaultAnimationEnd(hideUiRunnable);
|
||||||
|
|
||||||
|
if (hideUi && execOnEnd != null) {
|
||||||
|
Runnable combinedRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
execOnEnd.run();
|
||||||
|
hideUiRunnable.run();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
super.animateView(view, enterOrExit, duration, delay, combinedRunnable, true);
|
||||||
|
} else super.animateView(view, enterOrExit, duration, delay, hideUi ? hideUiRunnable : execOnEnd, hideUi);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// Getters
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public TextView getTitleTextView() {
|
||||||
|
return titleTextView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextView getChannelTextView() {
|
||||||
|
return channelTextView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextView getVolumeTextView() {
|
||||||
|
return volumeTextView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextView getBrightnessTextView() {
|
||||||
|
return brightnessTextView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageButton getRepeatButton() {
|
||||||
|
return repeatButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageButton getPlayPauseButton() {
|
||||||
|
return playPauseButton;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener {
|
||||||
|
private boolean isMoving;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onDoubleTap(MotionEvent e) {
|
||||||
|
if (DEBUG) Log.d(TAG, "onDoubleTap() called with: e = [" + e + "]" + "rawXy = " + e.getRawX() + ", " + e.getRawY() + ", xy = " + e.getX() + ", " + e.getY());
|
||||||
|
if (!playerImpl.isPlaying()) return false;
|
||||||
|
if (e.getX() > playerImpl.getRootView().getWidth() / 2) playerImpl.onFastForward();
|
||||||
|
else playerImpl.onFastRewind();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onSingleTapConfirmed(MotionEvent e) {
|
||||||
|
if (DEBUG) Log.d(TAG, "onSingleTapConfirmed() called with: e = [" + e + "]");
|
||||||
|
if (playerImpl.getCurrentState() != StateInterface.STATE_PLAYING) return true;
|
||||||
|
|
||||||
|
if (playerImpl.isControlsVisible()) playerImpl.animateView(playerImpl.getControlsRoot(), false, 150, 0, true);
|
||||||
|
else {
|
||||||
|
playerImpl.animateView(playerImpl.getControlsRoot(), true, 500, 0, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
playerImpl.animateView(playerImpl.getControlsRoot(), false, 300, AbstractPlayer.DEFAULT_CONTROLS_HIDE_TIME, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
showSystemUi();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final float stepsBrightness = 21, stepBrightness = (1f / stepsBrightness), minBrightness = .01f;
|
||||||
|
private float currentBrightness = .5f;
|
||||||
|
|
||||||
|
private int currentVolume, maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
|
||||||
|
|
||||||
|
private final String brightnessUnicode = new String(Character.toChars(0x2600));
|
||||||
|
// private final String volumeUnicode = new String(Character.toChars(0x1F50A));
|
||||||
|
private final String volumeUnicode = new String(Character.toChars(0x1F508));
|
||||||
|
|
||||||
|
|
||||||
|
private final int MOVEMENT_THRESHOLD = 40;
|
||||||
|
private final int eventsThreshold = 3;
|
||||||
|
private boolean triggered = false;
|
||||||
|
private int eventsNum;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
|
||||||
|
//noinspection PointlessBooleanExpression
|
||||||
|
if (DEBUG && false) Log.d(TAG, "ExoPlayerActivity.onScroll = " +
|
||||||
|
", e1.getRaw = [" + e1.getRawX() + ", " + e1.getRawY() + "]" +
|
||||||
|
", e2.getRaw = [" + e2.getRawX() + ", " + e2.getRawY() + "]" +
|
||||||
|
", distanceXy = [" + distanceX + ", " + distanceY + "]");
|
||||||
|
float abs = Math.abs(e2.getY() - e1.getY());
|
||||||
|
if (!triggered) {
|
||||||
|
triggered = abs > MOVEMENT_THRESHOLD;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventsNum++ % eventsThreshold != 0 || playerImpl.getCurrentState() == StateInterface.STATE_COMPLETED) return false;
|
||||||
|
isMoving = true;
|
||||||
|
// boolean up = !((e2.getY() - e1.getY()) > 0) && distanceY > 0; // Android's origin point is on top
|
||||||
|
boolean up = distanceY > 0;
|
||||||
|
|
||||||
|
|
||||||
|
if (e1.getX() > playerImpl.getRootView().getWidth() / 2) {
|
||||||
|
currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) + (up ? 1 : -1);
|
||||||
|
if (currentVolume >= maxVolume) currentVolume = maxVolume;
|
||||||
|
if (currentVolume <= 0) currentVolume = 0;
|
||||||
|
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);
|
||||||
|
|
||||||
|
if (DEBUG) Log.d(TAG, "onScroll().volumeControl, currentVolume = " + currentVolume);
|
||||||
|
playerImpl.getVolumeTextView().setText(volumeUnicode + " " + Math.round((((float) currentVolume) / maxVolume) * 100) + "%");
|
||||||
|
|
||||||
|
if (playerImpl.getVolumeTextView().getVisibility() != View.VISIBLE) playerImpl.animateView(playerImpl.getVolumeTextView(), true, 200, 0);
|
||||||
|
if (playerImpl.getBrightnessTextView().getVisibility() == View.VISIBLE) playerImpl.getBrightnessTextView().setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
WindowManager.LayoutParams lp = getWindow().getAttributes();
|
||||||
|
currentBrightness += up ? stepBrightness : -stepBrightness;
|
||||||
|
if (currentBrightness >= 1f) currentBrightness = 1f;
|
||||||
|
if (currentBrightness <= minBrightness) currentBrightness = minBrightness;
|
||||||
|
|
||||||
|
lp.screenBrightness = currentBrightness;
|
||||||
|
getWindow().setAttributes(lp);
|
||||||
|
if (DEBUG) Log.d(TAG, "onScroll().brightnessControl, currentBrightness = " + currentBrightness);
|
||||||
|
int brightnessNormalized = Math.round(currentBrightness * 100);
|
||||||
|
|
||||||
|
playerImpl.getBrightnessTextView().setText(brightnessUnicode + " " + (brightnessNormalized == 1 ? 0 : brightnessNormalized) + "%");
|
||||||
|
|
||||||
|
if (playerImpl.getBrightnessTextView().getVisibility() != View.VISIBLE) playerImpl.animateView(playerImpl.getBrightnessTextView(), true, 200, 0);
|
||||||
|
if (playerImpl.getVolumeTextView().getVisibility() == View.VISIBLE) playerImpl.getVolumeTextView().setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onScrollEnd() {
|
||||||
|
if (DEBUG) Log.d(TAG, "onScrollEnd() called");
|
||||||
|
triggered = false;
|
||||||
|
eventsNum = 0;
|
||||||
|
/* if (playerImpl.getVolumeTextView().getVisibility() == View.VISIBLE) playerImpl.getVolumeTextView().setVisibility(View.GONE);
|
||||||
|
if (playerImpl.getBrightnessTextView().getVisibility() == View.VISIBLE) playerImpl.getBrightnessTextView().setVisibility(View.GONE);*/
|
||||||
|
if (playerImpl.getVolumeTextView().getVisibility() == View.VISIBLE) playerImpl.animateView(playerImpl.getVolumeTextView(), false, 200, 200);
|
||||||
|
if (playerImpl.getBrightnessTextView().getVisibility() == View.VISIBLE) playerImpl.animateView(playerImpl.getBrightnessTextView(), false, 200, 200);
|
||||||
|
|
||||||
|
if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == StateInterface.STATE_PLAYING) {
|
||||||
|
playerImpl.animateView(playerImpl.getControlsRoot(), false, 300, AbstractPlayer.DEFAULT_CONTROLS_HIDE_TIME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
|
gestureDetector.onTouchEvent(event);
|
||||||
|
if (event.getAction() == MotionEvent.ACTION_UP && isMoving) {
|
||||||
|
isMoving = false;
|
||||||
|
onScrollEnd();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -5,9 +5,8 @@ import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.media.MediaPlayer;
|
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
|
import android.media.MediaPlayer;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -28,7 +27,6 @@ import android.widget.MediaController;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.VideoView;
|
import android.widget.VideoView;
|
||||||
|
|
||||||
import org.schabi.newpipe.App;
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
package org.schabi.newpipe.player.popup;
|
package org.schabi.newpipe.player;
|
||||||
|
|
||||||
public interface StateInterface {
|
public interface StateInterface {
|
||||||
int STATE_LOADING = 123;
|
int STATE_LOADING = 123;
|
||||||
int STATE_PLAYING = 125;
|
int STATE_PLAYING = 124;
|
||||||
|
int STATE_BUFFERING = 125;
|
||||||
int STATE_PAUSED = 126;
|
int STATE_PAUSED = 126;
|
||||||
int STATE_PAUSED_SEEK = 127;
|
int STATE_PAUSED_SEEK = 127;
|
||||||
int STATE_COMPLETED = 128;
|
int STATE_COMPLETED = 128;
|
||||||
|
@ -11,6 +12,7 @@ public interface StateInterface {
|
||||||
|
|
||||||
void onLoading();
|
void onLoading();
|
||||||
void onPlaying();
|
void onPlaying();
|
||||||
|
void onBuffering();
|
||||||
void onPaused();
|
void onPaused();
|
||||||
void onPausedSeek();
|
void onPausedSeek();
|
||||||
void onCompleted();
|
void onCompleted();
|
|
@ -1,93 +0,0 @@
|
||||||
package org.schabi.newpipe.player.popup;
|
|
||||||
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.SeekBar;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.devbrackets.android.exomedia.ui.widget.EMVideoView;
|
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
|
||||||
|
|
||||||
public class PopupViewHolder {
|
|
||||||
private View rootView;
|
|
||||||
private EMVideoView videoView;
|
|
||||||
private View loadingPanel;
|
|
||||||
private ImageView endScreen;
|
|
||||||
private ImageView controlAnimationView;
|
|
||||||
private LinearLayout controlsRoot;
|
|
||||||
private SeekBar playbackSeekBar;
|
|
||||||
private TextView playbackCurrentTime;
|
|
||||||
private TextView playbackEndTime;
|
|
||||||
|
|
||||||
public PopupViewHolder(View rootView) {
|
|
||||||
if (rootView == null) return;
|
|
||||||
this.rootView = rootView;
|
|
||||||
this.videoView = (EMVideoView) rootView.findViewById(R.id.popupVideoView);
|
|
||||||
this.loadingPanel = rootView.findViewById(R.id.loadingPanel);
|
|
||||||
this.endScreen = (ImageView) rootView.findViewById(R.id.endScreen);
|
|
||||||
this.controlAnimationView = (ImageView) rootView.findViewById(R.id.controlAnimationView);
|
|
||||||
this.controlsRoot = (LinearLayout) rootView.findViewById(R.id.playbackControlRoot);
|
|
||||||
this.playbackSeekBar = (SeekBar) rootView.findViewById(R.id.playbackSeekBar);
|
|
||||||
this.playbackCurrentTime = (TextView) rootView.findViewById(R.id.playbackCurrentTime);
|
|
||||||
this.playbackEndTime = (TextView) rootView.findViewById(R.id.playbackEndTime);
|
|
||||||
doModifications();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void doModifications() {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) playbackSeekBar.getThumb().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
|
|
||||||
playbackSeekBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isControlsVisible() {
|
|
||||||
return controlsRoot != null && controlsRoot.getVisibility() == View.VISIBLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isVisible(View view) {
|
|
||||||
return view != null && view.getVisibility() == View.VISIBLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
// GETTERS
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
public View getRootView() {
|
|
||||||
return rootView;
|
|
||||||
}
|
|
||||||
|
|
||||||
public EMVideoView getVideoView() {
|
|
||||||
return videoView;
|
|
||||||
}
|
|
||||||
|
|
||||||
public View getLoadingPanel() {
|
|
||||||
return loadingPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ImageView getEndScreen() {
|
|
||||||
return endScreen;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ImageView getControlAnimationView() {
|
|
||||||
return controlAnimationView;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LinearLayout getControlsRoot() {
|
|
||||||
return controlsRoot;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SeekBar getPlaybackSeekBar() {
|
|
||||||
return playbackSeekBar;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextView getPlaybackCurrentTime() {
|
|
||||||
return playbackCurrentTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextView getPlaybackEndTime() {
|
|
||||||
return playbackEndTime;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -19,17 +19,14 @@ import android.view.inputmethod.InputMethodManager;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.schabi.newpipe.ChannelActivity;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.ReCaptchaActivity;
|
import org.schabi.newpipe.ReCaptchaActivity;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.search.SearchEngine;
|
import org.schabi.newpipe.extractor.search.SearchEngine;
|
||||||
import org.schabi.newpipe.extractor.search.SearchResult;
|
import org.schabi.newpipe.extractor.search.SearchResult;
|
||||||
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
||||||
import org.schabi.newpipe.report.ErrorActivity;
|
|
||||||
import org.schabi.newpipe.R;
|
|
||||||
import org.schabi.newpipe.detail.VideoItemDetailActivity;
|
|
||||||
import org.schabi.newpipe.detail.VideoItemDetailFragment;
|
|
||||||
import org.schabi.newpipe.info_list.InfoListAdapter;
|
import org.schabi.newpipe.info_list.InfoListAdapter;
|
||||||
|
import org.schabi.newpipe.report.ErrorActivity;
|
||||||
import org.schabi.newpipe.util.NavStack;
|
import org.schabi.newpipe.util.NavStack;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
|
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 347 B |
Before Width: | Height: | Size: 221 B |
After Width: | Height: | Size: 105 B |
After Width: | Height: | Size: 107 B |
Before Width: | Height: | Size: 92 B After Width: | Height: | Size: 92 B |
Before Width: | Height: | Size: 105 B |
Before Width: | Height: | Size: 283 B After Width: | Height: | Size: 283 B |
After Width: | Height: | Size: 234 B |
After Width: | Height: | Size: 976 B |
Before Width: | Height: | Size: 858 B |
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 257 B |
Before Width: | Height: | Size: 175 B |
After Width: | Height: | Size: 101 B |
After Width: | Height: | Size: 101 B |
Before Width: | Height: | Size: 90 B After Width: | Height: | Size: 90 B |
Before Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 220 B After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 185 B |
After Width: | Height: | Size: 673 B |
Before Width: | Height: | Size: 639 B |
Before Width: | Height: | Size: 436 B After Width: | Height: | Size: 436 B |
After Width: | Height: | Size: 106 B |
After Width: | Height: | Size: 109 B |
Before Width: | Height: | Size: 94 B After Width: | Height: | Size: 94 B |
Before Width: | Height: | Size: 343 B After Width: | Height: | Size: 343 B |
After Width: | Height: | Size: 258 B |
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 524 B |
After Width: | Height: | Size: 123 B |
After Width: | Height: | Size: 123 B |
After Width: | Height: | Size: 110 B |
Before Width: | Height: | Size: 461 B After Width: | Height: | Size: 461 B |
After Width: | Height: | Size: 356 B |
After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 707 B |
After Width: | Height: | Size: 125 B |
After Width: | Height: | Size: 124 B |
After Width: | Height: | Size: 111 B |
Before Width: | Height: | Size: 605 B After Width: | Height: | Size: 605 B |
After Width: | Height: | Size: 403 B |
After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.5 KiB |
|
@ -1,8 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<gradient
|
<gradient
|
||||||
android:startColor="#a0000000"
|
android:startColor="#8c000000"
|
||||||
android:centerColor="#26000000"
|
|
||||||
android:endColor="#00000000"
|
android:endColor="#00000000"
|
||||||
android:angle="90"
|
android:angle="90"
|
||||||
/>
|
/>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<gradient
|
||||||
|
android:startColor="#8c000000"
|
||||||
|
android:endColor="#00000000"
|
||||||
|
android:angle="-90"
|
||||||
|
/>
|
||||||
|
</shape>
|
|
@ -1,15 +1,318 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout
|
<FrameLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:id="@+id/root"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:focusable="true"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="@android:color/black"
|
||||||
|
android:gravity="center"
|
||||||
android:keepScreenOn="true">
|
android:keepScreenOn="true">
|
||||||
|
|
||||||
<com.devbrackets.android.exomedia.ui.widget.EMVideoView
|
<com.google.android.exoplayer2.ui.AspectRatioFrameLayout
|
||||||
android:id="@+id/emVideoView"
|
android:id="@+id/aspectRatioLayout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"/>
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center">
|
||||||
|
|
||||||
</RelativeLayout>
|
<SurfaceView
|
||||||
|
android:id="@+id/surfaceView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center"/>
|
||||||
|
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/surfaceForeground"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@android:color/black"/>
|
||||||
|
|
||||||
|
</com.google.android.exoplayer2.ui.AspectRatioFrameLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/endScreen"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:scaleType="centerInside"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:background="@android:color/white"
|
||||||
|
tools:ignore="ContentDescription"
|
||||||
|
tools:visibility="visible"/>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/playbackControlRoot"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#64000000"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/topControls"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:background="@drawable/player_top_controls_bg"
|
||||||
|
android:gravity="top"
|
||||||
|
android:paddingBottom="70dp"
|
||||||
|
android:paddingLeft="2dp"
|
||||||
|
android:paddingRight="10dp"
|
||||||
|
android:paddingTop="10dp"
|
||||||
|
tools:ignore="RtlHardcoded">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_toLeftOf="@+id/qualityTextView"
|
||||||
|
android:gravity="top"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
tools:ignore="RtlHardcoded">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/titleTextView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="15sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
tools:ignore="RtlHardcoded"
|
||||||
|
tools:text="The Video Title LONG very LONG"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/channelTextView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="12sp"
|
||||||
|
tools:text="The Video Artist LONG very LONG very Long"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/qualityTextView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="35dp"
|
||||||
|
android:layout_marginLeft="2dp"
|
||||||
|
android:layout_marginRight="2dp"
|
||||||
|
android:layout_toLeftOf="@+id/screenRotationButton"
|
||||||
|
android:gravity="center"
|
||||||
|
android:minWidth="50dp"
|
||||||
|
android:text="720p"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textStyle="bold"
|
||||||
|
tools:ignore="HardcodedText,RtlHardcoded"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/screenRotationButton"
|
||||||
|
android:layout_width="35dp"
|
||||||
|
android:layout_height="35dp"
|
||||||
|
android:layout_marginLeft="2dp"
|
||||||
|
android:layout_marginRight="2dp"
|
||||||
|
android:layout_toLeftOf="@+id/repeatButton"
|
||||||
|
android:background="#00ffffff"
|
||||||
|
android:clickable="true"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ic_screen_rotation_white"
|
||||||
|
tools:ignore="ContentDescription,RtlHardcoded"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/repeatButton"
|
||||||
|
android:layout_width="35dp"
|
||||||
|
android:layout_height="35dp"
|
||||||
|
android:layout_marginLeft="2dp"
|
||||||
|
android:layout_marginRight="2dp"
|
||||||
|
android:layout_toLeftOf="@+id/fullScreenButton"
|
||||||
|
android:background="#00ffffff"
|
||||||
|
android:clickable="true"
|
||||||
|
android:padding="5dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ic_repeat_white"
|
||||||
|
tools:ignore="ContentDescription,RtlHardcoded"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/fullScreenButton"
|
||||||
|
android:layout_width="35dp"
|
||||||
|
android:layout_height="35dp"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_marginLeft="4dp"
|
||||||
|
android:background="#00ffffff"
|
||||||
|
android:clickable="true"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ic_fullscreen_exit_white"
|
||||||
|
tools:ignore="ContentDescription,RtlHardcoded"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/bottomControls"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:background="@drawable/player_controls_bg"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingLeft="16dp"
|
||||||
|
android:paddingRight="16dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/playbackCurrentTime"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
|
android:minHeight="40dp"
|
||||||
|
android:text="-:--:--"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
tools:ignore="HardcodedText"
|
||||||
|
tools:text="1:06:29"/>
|
||||||
|
|
||||||
|
|
||||||
|
<android.support.v7.widget.AppCompatSeekBar
|
||||||
|
android:id="@+id/playbackSeekBar"
|
||||||
|
style="@style/Widget.AppCompat.SeekBar"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:paddingBottom="4dp"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
tools:progress="25"
|
||||||
|
tools:secondaryProgress="50"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/playbackEndTime"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="-:--:--"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
tools:ignore="HardcodedText"
|
||||||
|
tools:text="1:23:49"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/playPauseButton"
|
||||||
|
android:layout_width="100dp"
|
||||||
|
android:layout_height="100dp"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:background="#00000000"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ic_pause_white"
|
||||||
|
tools:ignore="ContentDescription"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/controlAnimationView"
|
||||||
|
android:layout_width="100dp"
|
||||||
|
android:layout_height="100dp"
|
||||||
|
android:src="@drawable/ic_action_av_fast_rewind"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:ignore="ContentDescription"
|
||||||
|
tools:visibility="visible"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/loadingPanel"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@android:color/black"
|
||||||
|
tools:visibility="gone">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progressBarLoadingPanel"
|
||||||
|
style="?android:attr/progressBarStyleLargeInverse"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:indeterminate="true"/>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
tools:ignore="RtlHardcoded">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/volumeTextView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_marginLeft="20dp"
|
||||||
|
android:background="#64000000"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
android:paddingLeft="30dp"
|
||||||
|
android:paddingRight="30dp"
|
||||||
|
android:paddingTop="10dp"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="35sp"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:ignore="RtlHardcoded"
|
||||||
|
tools:text="Volume 0"
|
||||||
|
tools:visibility="visible"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/brightnessTextView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_marginRight="20dp"
|
||||||
|
android:background="#64000000"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
android:paddingLeft="30dp"
|
||||||
|
android:paddingRight="30dp"
|
||||||
|
android:paddingTop="10dp"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="35sp"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:ignore="RtlHardcoded"
|
||||||
|
tools:text="Brightness 0"
|
||||||
|
tools:visibility="visible"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/currentDisplaySeek"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_marginBottom="58dp"
|
||||||
|
android:background="#64000000"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
android:paddingLeft="30dp"
|
||||||
|
android:paddingRight="30dp"
|
||||||
|
android:paddingTop="10dp"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="26sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:ignore="RtlHardcoded"
|
||||||
|
tools:text="1:06:29"
|
||||||
|
tools:visibility="visible"/>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</FrameLayout>
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
|
||||||
tools:context="org.schabi.newpipe.ChannelActivity"
|
|
||||||
tools:showIn="@layout/activity_channel">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_margin="@dimen/text_margin"
|
|
||||||
android:text="@string/large_text" />
|
|
||||||
|
|
||||||
</android.support.v4.widget.NestedScrollView>
|
|
|
@ -1,180 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<com.devbrackets.android.exomedia.ui.widget.FitsSystemWindowRelativeLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/exomedia_controls_text_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:background="@drawable/exomedia_default_controls_text_background"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:paddingBottom="16dp"
|
|
||||||
android:paddingLeft="16dp"
|
|
||||||
android:paddingRight="16dp"
|
|
||||||
android:paddingTop="16dp"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/exomedia_controls_title"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:textStyle="bold"
|
|
||||||
tools:text="The Video Title"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/exomedia_controls_sub_title"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
android:textSize="14sp"
|
|
||||||
tools:text="The Video Album"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/exomedia_controls_description"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
android:textSize="14sp"
|
|
||||||
tools:text="The Video Artist"/>
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/exomedia_controls_interactive_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:layout_alignParentLeft="true"
|
|
||||||
android:layout_alignParentStart="true"
|
|
||||||
android:background="@drawable/exomedia_default_controls_interactive_background"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:paddingBottom="16dp"
|
|
||||||
android:paddingTop="16dp">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/exomedia_controls_current_time"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingLeft="2dp"
|
|
||||||
android:paddingRight="2dp"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
tools:ignore="RtlHardcoded"
|
|
||||||
tools:text="1:06:29"/>
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/exomedia_controls_video_seek"
|
|
||||||
style="?android:seekBarStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
tools:ignore="RtlHardcoded"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/exomedia_controls_end_time"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingLeft="2dp"
|
|
||||||
android:paddingRight="2dp"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
tools:ignore="RtlHardcoded"
|
|
||||||
tools:text="1:23:49"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/exomedia_controls_extra_container"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
tools:ignore="RtlHardcoded,UselessLeaf"/>
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginLeft="16dp"
|
|
||||||
android:layout_marginRight="16dp"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/exomedia_controls_previous_btn"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginRight="24dp"
|
|
||||||
android:background="@android:color/transparent"
|
|
||||||
android:minHeight="24dp"
|
|
||||||
android:minWidth="24dp"
|
|
||||||
app:srcCompat="@drawable/exomedia_ic_skip_previous_white"
|
|
||||||
tools:ignore="ContentDescription,RtlHardcoded"
|
|
||||||
tools:visibility="visible"/>
|
|
||||||
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/exomedia_controls_frewind_btn"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginRight="24dp"
|
|
||||||
android:background="@android:color/transparent"
|
|
||||||
android:minHeight="24dp"
|
|
||||||
android:minWidth="24dp"
|
|
||||||
android:src="@drawable/exomedia_ic_rewind_white"
|
|
||||||
tools:ignore="ContentDescription,RtlHardcoded"
|
|
||||||
tools:visibility="visible"/>
|
|
||||||
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/exomedia_controls_play_pause_btn"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="@android:color/transparent"
|
|
||||||
android:minHeight="24dp"
|
|
||||||
android:minWidth="24dp"
|
|
||||||
app:srcCompat="@drawable/exomedia_ic_play_arrow_white"
|
|
||||||
tools:ignore="ContentDescription"/>
|
|
||||||
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/exomedia_controls_fforward_btn"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginLeft="24dp"
|
|
||||||
android:background="@android:color/transparent"
|
|
||||||
android:minHeight="24dp"
|
|
||||||
android:minWidth="24dp"
|
|
||||||
android:src="@drawable/exomedia_ic_fast_forward_white"
|
|
||||||
tools:ignore="ContentDescription,RtlHardcoded"
|
|
||||||
tools:visibility="visible"/>
|
|
||||||
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/exomedia_controls_next_btn"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginLeft="24dp"
|
|
||||||
android:background="@android:color/transparent"
|
|
||||||
android:minHeight="24dp"
|
|
||||||
android:minWidth="24dp"
|
|
||||||
app:srcCompat="@drawable/exomedia_ic_skip_next_white"
|
|
||||||
tools:ignore="ContentDescription,RtlHardcoded"
|
|
||||||
tools:visibility="visible"/>
|
|
||||||
</LinearLayout>
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/exomedia_controls_video_loading"
|
|
||||||
style="?android:progressBarStyleLarge"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_centerInParent="true"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
</com.devbrackets.android.exomedia.ui.widget.FitsSystemWindowRelativeLayout>
|
|
|
@ -65,7 +65,7 @@
|
||||||
android:background="#00ffffff"
|
android:background="#00ffffff"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:scaleType="fitXY"
|
android:scaleType="fitXY"
|
||||||
android:src="@drawable/ic_pause_white_24dp" />
|
android:src="@drawable/ic_pause_white" />
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/notificationStop"
|
android:id="@+id/notificationStop"
|
||||||
|
@ -75,7 +75,7 @@
|
||||||
android:background="#00ffffff"
|
android:background="#00ffffff"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:scaleType="fitXY"
|
android:scaleType="fitXY"
|
||||||
android:src="@drawable/ic_close_white_24dp" />
|
android:src="@drawable/ic_close_white" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
android:background="#00ffffff"
|
android:background="#00ffffff"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:scaleType="fitXY"
|
android:scaleType="fitXY"
|
||||||
android:src="@drawable/ic_close_white_24dp" />
|
android:src="@drawable/ic_close_white" />
|
||||||
|
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
|
@ -77,7 +77,7 @@
|
||||||
android:background="#00ffffff"
|
android:background="#00ffffff"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:scaleType="fitXY"
|
android:scaleType="fitXY"
|
||||||
android:src="@drawable/ic_pause_white_24dp"
|
android:src="@drawable/ic_pause_white"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_alignParentTop="true"
|
||||||
android:layout_centerHorizontal="true" />
|
android:layout_centerHorizontal="true" />
|
||||||
|
|
||||||
|
|
|
@ -4,18 +4,29 @@
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="@android:color/black"
|
||||||
android:gravity="center">
|
android:gravity="center">
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:id="@+id/blackBackground"
|
<com.google.android.exoplayer2.ui.AspectRatioFrameLayout
|
||||||
|
android:id="@+id/aspectRatioLayout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="@color/black"/>
|
android:layout_gravity="center">
|
||||||
|
|
||||||
<com.devbrackets.android.exomedia.ui.widget.EMVideoView
|
<SurfaceView
|
||||||
android:id="@+id/popupVideoView"
|
android:id="@+id/surfaceView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"/>
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/surfaceForeground"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@android:color/black"/>
|
||||||
|
|
||||||
|
</com.google.android.exoplayer2.ui.AspectRatioFrameLayout>
|
||||||
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
|
@ -24,72 +35,142 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="@color/black"
|
android:background="@color/black"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible"
|
|
||||||
tools:background="@android:color/white"
|
tools:background="@android:color/white"
|
||||||
tools:ignore="ContentDescription"/>
|
tools:ignore="ContentDescription"
|
||||||
|
tools:visibility="visible"/>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/playbackControlRoot"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#32000000"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/topControls"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:background="@drawable/player_top_controls_bg"
|
||||||
|
android:paddingBottom="20dp"
|
||||||
|
android:paddingLeft="6dp"
|
||||||
|
android:paddingRight="6dp"
|
||||||
|
android:paddingTop="4dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/qualityTextView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:padding="5dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="720p"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textStyle="bold"
|
||||||
|
tools:ignore="HardcodedText,RtlHardcoded,RtlSymmetry"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/fullScreenButton"
|
||||||
|
android:layout_width="30dp"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:background="#00ffffff"
|
||||||
|
android:clickable="true"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
android:src="@drawable/ic_fullscreen_white"
|
||||||
|
tools:ignore="ContentDescription,RtlHardcoded"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<!--Shadow Bottom Control-->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:background="@drawable/player_controls_bg"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingTop="50dp"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/bottomControls"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingBottom="2dp"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/playbackCurrentTime"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:text="-:--:--"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
tools:ignore="HardcodedText,RtlHardcoded,RtlSymmetry"
|
||||||
|
tools:text="1:06:29"/>
|
||||||
|
|
||||||
|
<android.support.v7.widget.AppCompatSeekBar
|
||||||
|
android:id="@+id/playbackSeekBar"
|
||||||
|
style="@style/Widget.AppCompat.SeekBar"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_weight="1"
|
||||||
|
tools:progress="25"
|
||||||
|
tools:secondaryProgress="50"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/playbackEndTime"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:text="-:--:--"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
tools:ignore="HardcodedText,RtlHardcoded,RtlSymmetry"
|
||||||
|
tools:text="1:23:49"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:orientation="vertical"
|
android:orientation="horizontal"
|
||||||
android:weightSum="2">
|
android:weightSum="5">
|
||||||
|
<!--tools:visibility="gone">-->
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/controlAnimationView"
|
android:id="@+id/controlAnimationView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="match_parent"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:src="@drawable/ic_action_av_fast_rewind"
|
android:src="@drawable/ic_action_av_fast_rewind"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible"
|
tools:ignore="ContentDescription"
|
||||||
tools:ignore="ContentDescription"/>
|
tools:visibility="visible"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
<LinearLayout
|
android:id="@+id/currentDisplaySeek"
|
||||||
android:id="@+id/playbackControlRoot"
|
android:layout_width="wrap_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:layout_height="60dp"
|
android:layout_gravity="center"
|
||||||
android:layout_gravity="bottom"
|
android:background="#64000000"
|
||||||
android:paddingBottom="5dp"
|
android:paddingBottom="5dp"
|
||||||
android:paddingLeft="8dp"
|
android:paddingLeft="20dp"
|
||||||
android:paddingRight="8dp"
|
android:paddingRight="20dp"
|
||||||
android:gravity="bottom|center"
|
android:paddingTop="5dp"
|
||||||
android:orientation="horizontal"
|
android:textColor="@android:color/white"
|
||||||
android:background="@drawable/popup_controls_bg"
|
android:textSize="18sp"
|
||||||
|
android:textStyle="bold"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible">
|
tools:ignore="RtlHardcoded"
|
||||||
|
tools:text="1:06:29"
|
||||||
<TextView
|
tools:visibility="visible"/>
|
||||||
android:id="@+id/playbackCurrentTime"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingLeft="2dp"
|
|
||||||
android:paddingRight="2dp"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
tools:ignore="HardcodedText"
|
|
||||||
android:text="-:--:--"/>
|
|
||||||
|
|
||||||
<!--style="?android:attr/progressBarStyleHorizontal"-->
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/playbackSeekBar"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:max="100"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:progress="0"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/playbackEndTime"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingLeft="2dp"
|
|
||||||
android:paddingRight="2dp"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
tools:ignore="HardcodedText"
|
|
||||||
android:text="-:--:--"/>
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
android:id="@+id/loadingPanel"
|
android:id="@+id/loadingPanel"
|
||||||
|
@ -102,6 +183,7 @@
|
||||||
tools:visibility="gone">
|
tools:visibility="gone">
|
||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
|
android:id="@+id/progressBarLoadingPanel"
|
||||||
style="?android:attr/progressBarStyleLarge"
|
style="?android:attr/progressBarStyleLarge"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:ellipsize="marquee"
|
android:ellipsize="marquee"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
tools:text="title"/>
|
tools:text="a long, long, long, long, long title"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/notificationArtist"
|
android:id="@+id/notificationArtist"
|
||||||
|
@ -42,28 +42,38 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:ellipsize="marquee"
|
android:ellipsize="marquee"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
tools:text="artist"/>
|
tools:text="a long, long artist"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/notificationPlayPause"
|
android:id="@+id/notificationRepeat"
|
||||||
android:layout_width="40dp"
|
android:layout_width="40dp"
|
||||||
android:layout_height="40dp"
|
android:layout_height="match_parent"
|
||||||
android:layout_margin="5dp"
|
android:background="#00000000"
|
||||||
android:background="#00ffffff"
|
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:scaleType="fitXY"
|
android:padding="5dp"
|
||||||
android:src="@drawable/ic_pause_white_24dp"
|
android:scaleType="fitCenter"
|
||||||
|
android:src="@drawable/ic_repeat_white"
|
||||||
|
tools:ignore="ContentDescription"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/notificationPlayPause"
|
||||||
|
android:layout_width="45dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#00000000"
|
||||||
|
android:clickable="true"
|
||||||
|
android:src="@drawable/ic_pause_white"
|
||||||
tools:ignore="ContentDescription"/>
|
tools:ignore="ContentDescription"/>
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/notificationStop"
|
android:id="@+id/notificationStop"
|
||||||
android:layout_width="40dp"
|
android:layout_width="40dp"
|
||||||
android:layout_height="40dp"
|
android:layout_height="40dp"
|
||||||
android:layout_margin="5dp"
|
android:layout_marginLeft="5dp"
|
||||||
android:background="#00ffffff"
|
android:background="#00000000"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:scaleType="fitXY"
|
android:padding="5dp"
|
||||||
android:src="@drawable/ic_close_white_24dp"
|
android:scaleType="fitCenter"
|
||||||
tools:ignore="ContentDescription"/>
|
android:src="@drawable/ic_close_white"
|
||||||
|
tools:ignore="ContentDescription,RtlHardcoded"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
|
@ -5,5 +5,5 @@
|
||||||
<item android:id="@+id/menu_item_screen_rotation"
|
<item android:id="@+id/menu_item_screen_rotation"
|
||||||
android:title="@string/screen_rotation"
|
android:title="@string/screen_rotation"
|
||||||
app:showAsAction="always"
|
app:showAsAction="always"
|
||||||
android:icon="@drawable/ic_screen_rotation_white_24dp"/>
|
android:icon="@drawable/ic_screen_rotation_white"/>
|
||||||
</menu>
|
</menu>
|
|
@ -1,27 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="abc_action_bar_home_description">Navigate home</string>
|
|
||||||
<string name="abc_action_bar_home_description_format">%1$s, %2$s</string>
|
|
||||||
<string name="abc_action_bar_home_subtitle_description_format">%1$s, %2$s, %3$s</string>
|
|
||||||
<string name="abc_action_bar_up_description">Navigate up</string>
|
|
||||||
<string name="abc_action_menu_overflow_description">More options</string>
|
|
||||||
<string name="abc_action_mode_done">Done</string>
|
|
||||||
<string name="abc_activity_chooser_view_see_all">See all</string>
|
|
||||||
<string name="abc_activitychooserview_choose_application">Choose an app</string>
|
|
||||||
<string name="abc_capital_off">OFF</string>
|
|
||||||
<string name="abc_capital_on">ON</string>
|
|
||||||
<string name="abc_search_hint">Search…</string>
|
|
||||||
<string name="abc_searchview_description_clear">Clear query</string>
|
|
||||||
<string name="abc_searchview_description_query">Search query</string>
|
|
||||||
<string name="abc_searchview_description_search">Search</string>
|
|
||||||
<string name="abc_searchview_description_submit">Submit query</string>
|
|
||||||
<string name="abc_searchview_description_voice">Voice search</string>
|
|
||||||
<string name="abc_shareactionprovider_share_with">Share with</string>
|
|
||||||
<string name="abc_shareactionprovider_share_with_application">Share with %s</string>
|
|
||||||
<string name="abc_toolbar_collapse_description">Collapse</string>
|
|
||||||
<string name="status_bar_notification_info_overflow">999+</string>
|
|
||||||
<string name="autoplay_through_intent_summary">"بدء تشغيل الفيديو تلقائيًا عندما يتم فتحه من تطبيق أخر."</string>
|
|
||||||
<string name="autoplay_through_intent_title">التشغيل التلقائي</string>
|
|
||||||
<string name="background_player_name">مشغل NewPipe في الخلفية</string>
|
<string name="background_player_name">مشغل NewPipe في الخلفية</string>
|
||||||
<string name="background_player_playing_toast">جاري التشغيل في الخلفية</string>
|
<string name="background_player_playing_toast">جاري التشغيل في الخلفية</string>
|
||||||
<string name="cancel">إلغاء</string>
|
<string name="cancel">إلغاء</string>
|
||||||
|
@ -87,31 +65,4 @@
|
||||||
<string name="general_error">خطأ</string>
|
<string name="general_error">خطأ</string>
|
||||||
<string name="parsing_error">لا يمكن تحليل الموقع.</string>
|
<string name="parsing_error">لا يمكن تحليل الموقع.</string>
|
||||||
<string name="youtube_signature_decryption_error">لا يمكن فك تشفير توقيع رابط الفيديو.</string>
|
<string name="youtube_signature_decryption_error">لا يمكن فك تشفير توقيع رابط الفيديو.</string>
|
||||||
<string name="app_name">NewPipe</string>
|
|
||||||
<string name="appbar_scrolling_view_behavior">android.support.design.widget.AppBarLayout$ScrollingViewBehavior</string>
|
|
||||||
<string name="autoplay_through_intent_key">autoplay_through_intent</string>
|
|
||||||
<string name="background_player_time_text">%1$s - NewPipe</string>
|
|
||||||
<string name="c3s_url">https://www.c3s.cc/</string>
|
|
||||||
<string name="character_counter_pattern">%1$d / %2$d</string>
|
|
||||||
<string name="default_audio_format_key">default_audio_format</string>
|
|
||||||
<string name="default_audio_format_value">m4a</string>
|
|
||||||
<string name="default_language_value">en</string>
|
|
||||||
<string name="default_resolution_key">default_resolution_preference</string>
|
|
||||||
<string name="default_resolution_value">360p</string>
|
|
||||||
<string name="default_theme_value">0</string>
|
|
||||||
<string name="download_path_audio_key">download_path_audio</string>
|
|
||||||
<string name="download_path_key">download_path</string>
|
|
||||||
<string name="fdroid_kore_url">https://f-droid.org/repository/browse/?fdfilter=Kore&fdid=org.xbmc.kore</string>
|
|
||||||
<string name="fdroid_vlc_url">https://f-droid.org/repository/browse/?fdfilter=vlc&fdid=org.videolan.vlc</string>
|
|
||||||
<string name="search_language_key">search_language</string>
|
|
||||||
<string name="settings_category_appearance">settings_category_appearance</string>
|
|
||||||
<string name="settings_category_other">settings_category_other</string>
|
|
||||||
<string name="settings_category_video_audio">settings_category_video_audio</string>
|
|
||||||
<string name="show_next_video_key">show_next_video</string>
|
|
||||||
<string name="show_play_with_kodi_key">show_play_with_kodi</string>
|
|
||||||
<string name="theme_key">الثيمات</string>
|
|
||||||
<string name="title_videoitem_detail">NewPipe</string>
|
|
||||||
<string name="use_external_audio_player_key">use_external_audio_player</string>
|
|
||||||
<string name="use_external_video_player_key">use_external_video_player</string>
|
|
||||||
<string name="use_tor_key">use_tor</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -22,8 +22,6 @@
|
||||||
<string name="download_path_audio_dialog_title">Zadejte umístění pro stažené audio soubory.</string>
|
<string name="download_path_audio_dialog_title">Zadejte umístění pro stažené audio soubory.</string>
|
||||||
|
|
||||||
<string name="download_path_audio_title">Umístění pro stažené audio</string>
|
<string name="download_path_audio_title">Umístění pro stažené audio</string>
|
||||||
<string name="autoplay_through_intent_title">Automatické přehrávání skrze Intent</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Automaticky přehrávat video, jestliže je volané z jiné aplikace.</string>
|
|
||||||
<string name="default_resolution_title">Výchozí rozlišení</string>
|
<string name="default_resolution_title">Výchozí rozlišení</string>
|
||||||
<string name="play_with_kodi_title">Přehrát pomocí Kodi</string>
|
<string name="play_with_kodi_title">Přehrát pomocí Kodi</string>
|
||||||
<string name="kore_not_found">Aplikace Kore nenalezena. Nainstalovat Kore?</string>
|
<string name="kore_not_found">Aplikace Kore nenalezena. Nainstalovat Kore?</string>
|
||||||
|
@ -159,143 +157,6 @@
|
||||||
<string name="title_activity_channel">Aktivita kanálu</string>
|
<string name="title_activity_channel">Aktivita kanálu</string>
|
||||||
<string name="user_report">Hlášení uživatele</string>
|
<string name="user_report">Hlášení uživatele</string>
|
||||||
|
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="logging_verbose">Podrobné</string>
|
<string name="logging_verbose">Podrobné</string>
|
||||||
<string name="error_querying_decoders">Nelze zjistit dekodéry zařízení</string>
|
<string name="error_querying_decoders">Nelze zjistit dekodéry zařízení</string>
|
||||||
<string name="error_instantiating_decoder">Nelze doložit dekodér <xliff:g id="decoder_name">
|
<string name="error_instantiating_decoder">Nelze doložit dekodér <xliff:g id="decoder_name">
|
||||||
|
|
|
@ -16,16 +16,12 @@
|
||||||
<string name="choose_browser">Browser</string>
|
<string name="choose_browser">Browser</string>
|
||||||
<string name="screen_rotation">Rotation</string>
|
<string name="screen_rotation">Rotation</string>
|
||||||
<string name="settings_activity_title">Einstellungen</string>
|
<string name="settings_activity_title">Einstellungen</string>
|
||||||
<string name="useExternalPlayerTitle">Externen Player benutzen</string>
|
|
||||||
<string name="download_path_title">Downloadverzeichnis für Videos</string>
|
<string name="download_path_title">Downloadverzeichnis für Videos</string>
|
||||||
<string name="download_path_summary">Verzeichnis in dem heruntergeladene Videos gespeichert werden.</string>
|
<string name="download_path_summary">Verzeichnis in dem heruntergeladene Videos gespeichert werden.</string>
|
||||||
<string name="download_path_dialog_title">Downloadverzeichnis für Videos eingeben</string>
|
<string name="download_path_dialog_title">Downloadverzeichnis für Videos eingeben</string>
|
||||||
<string name="autoplay_through_intent_title">Automatisches Abspielen durch Intent</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Startet ein Video automatisch wenn es von einer anderen App aufgerufen wurde.</string>
|
|
||||||
<string name="default_resolution_title">Standardauflösung</string>
|
<string name="default_resolution_title">Standardauflösung</string>
|
||||||
<string name="play_with_kodi_title">Mit Kodi abspielen</string>
|
<string name="play_with_kodi_title">Mit Kodi abspielen</string>
|
||||||
<string name="kore_not_found">Kore App wurde nicht gefunden. Möchten sie Kore jetzt installieren?</string>
|
<string name="kore_not_found">Kore App wurde nicht gefunden. Möchten sie Kore jetzt installieren?</string>
|
||||||
<string name="installeKore">Kore installieren</string>
|
|
||||||
<string name="show_play_with_kodi_title">Zeige \"Mit Kodi abspielen\" Option</string>
|
<string name="show_play_with_kodi_title">Zeige \"Mit Kodi abspielen\" Option</string>
|
||||||
<string name="show_play_with_kodi_summary">Zeigt eine Option an, über die man Videos mit dem Kodi Mediacenter abspielen kann.</string>
|
<string name="show_play_with_kodi_summary">Zeigt eine Option an, über die man Videos mit dem Kodi Mediacenter abspielen kann.</string>
|
||||||
<string name="play_audio">Audio</string>
|
<string name="play_audio">Audio</string>
|
||||||
|
@ -169,143 +165,6 @@
|
||||||
<string name="msg_url_malform">Beschädigte URL oder Internet nicht erreichbar</string>
|
<string name="msg_url_malform">Beschädigte URL oder Internet nicht erreichbar</string>
|
||||||
<string name="msg_fetch_filename">Vorgeschlagener Dateiname</string>
|
<string name="msg_fetch_filename">Vorgeschlagener Dateiname</string>
|
||||||
<string name="title_activity_channel">Kanalaktivität</string>
|
<string name="title_activity_channel">Kanalaktivität</string>
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||||
<string name="black_theme_title">Schwarz</string>
|
<string name="black_theme_title">Schwarz</string>
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,6 @@
|
||||||
<string name="download_path_audio_summary">Διαδρομή για αποθήκευση αρχείων ήχου</string>
|
<string name="download_path_audio_summary">Διαδρομή για αποθήκευση αρχείων ήχου</string>
|
||||||
<string name="download_path_audio_dialog_title">Εισάγετε διαδρομή για λήψη αρχείων ήχου.</string>
|
<string name="download_path_audio_dialog_title">Εισάγετε διαδρομή για λήψη αρχείων ήχου.</string>
|
||||||
|
|
||||||
<string name="autoplay_through_intent_title">Αυτόματη αναπαραγωγή μέσω Intent</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Αυτόματη αναπαραγωγή video όταν καλείται από άλλη εφαρμογή.</string>
|
|
||||||
<string name="default_resolution_title">Προεπιλεγμένη ανάλυση</string>
|
<string name="default_resolution_title">Προεπιλεγμένη ανάλυση</string>
|
||||||
<string name="play_with_kodi_title">Αναπαραγωγή με το Kodi</string>
|
<string name="play_with_kodi_title">Αναπαραγωγή με το Kodi</string>
|
||||||
<string name="kore_not_found">Η εφαρμογή Kore δεν βρέθηκε. Εγκατάσταση;</string>
|
<string name="kore_not_found">Η εφαρμογή Kore δεν βρέθηκε. Εγκατάσταση;</string>
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
<string name="detail_likes_img_view_description">Ŝatoj</string>
|
<string name="detail_likes_img_view_description">Ŝatoj</string>
|
||||||
<string name="detail_dislikes_img_view_description">Malŝatoj</string>
|
<string name="detail_dislikes_img_view_description">Malŝatoj</string>
|
||||||
<string name="use_tor_title">Uzi la programon Tor</string>
|
<string name="use_tor_title">Uzi la programon Tor</string>
|
||||||
<string name="autoplay_through_intent_title">Ludi aŭtomate per Intent</string>
|
|
||||||
<string name="no_player_found">Neniu elsendlflua ludilo trovita. Ĉu instali la aplikaĵon VLC?</string>
|
<string name="no_player_found">Neniu elsendlflua ludilo trovita. Ĉu instali la aplikaĵon VLC?</string>
|
||||||
<string name="kore_not_found">La aplikaĵo Kore ne estas trovita. Ĉu instali la aplikaĵon Kore?</string>
|
<string name="kore_not_found">La aplikaĵo Kore ne estas trovita. Ĉu instali la aplikaĵon Kore?</string>
|
||||||
<string name="show_next_and_similar_title">Montri la sekvan videon kaj similajn videojn</string>
|
<string name="show_next_and_similar_title">Montri la sekvan videon kaj similajn videojn</string>
|
||||||
|
@ -67,7 +66,6 @@
|
||||||
<string name="show_play_with_kodi_summary">Montri opcion por ludi videon per la aplikaĵo Kodi.</string>
|
<string name="show_play_with_kodi_summary">Montri opcion por ludi videon per la aplikaĵo Kodi.</string>
|
||||||
<string name="download_path_summary">Dosierujo por konservi elŝutitajn videojn.</string>
|
<string name="download_path_summary">Dosierujo por konservi elŝutitajn videojn.</string>
|
||||||
<string name="download_path_audio_summary">Dosierujo por konservi elŝutitan muzikon</string>
|
<string name="download_path_audio_summary">Dosierujo por konservi elŝutitan muzikon</string>
|
||||||
<string name="autoplay_through_intent_summary">Ludi videon aŭtomate kiam ĝi estas vokita de alia aplikaĵo.</string>
|
|
||||||
<string name="download_path_dialog_title">Elektu lokon por konservi elŝutitajn videojn</string>
|
<string name="download_path_dialog_title">Elektu lokon por konservi elŝutitajn videojn</string>
|
||||||
|
|
||||||
<string name="download_path_audio_dialog_title">Elektu lokon por konservi elŝutitan muzikon.</string>
|
<string name="download_path_audio_dialog_title">Elektu lokon por konservi elŝutitan muzikon.</string>
|
||||||
|
|
|
@ -16,16 +16,12 @@
|
||||||
<string name="choose_browser">Seleccionar navegador</string>
|
<string name="choose_browser">Seleccionar navegador</string>
|
||||||
<string name="screen_rotation">rotación</string>
|
<string name="screen_rotation">rotación</string>
|
||||||
<string name="settings_activity_title">Ajustes</string>
|
<string name="settings_activity_title">Ajustes</string>
|
||||||
<string name="useExternalPlayerTitle">Usar reproductor externo</string>
|
|
||||||
<string name="download_path_title">Ruta de descarga de vídeo</string>
|
<string name="download_path_title">Ruta de descarga de vídeo</string>
|
||||||
<string name="download_path_summary">Ruta para almacenar los vídeos descargados.</string>
|
<string name="download_path_summary">Ruta para almacenar los vídeos descargados.</string>
|
||||||
<string name="download_path_dialog_title">Introducir directorio de descargas para vídeos</string>
|
<string name="download_path_dialog_title">Introducir directorio de descargas para vídeos</string>
|
||||||
<string name="autoplay_through_intent_title">Intentar reproducción automática</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Reproducir vídeos automáticamente cuando se llamen desde otra aplicación.</string>
|
|
||||||
<string name="default_resolution_title">Resolución por defecto</string>
|
<string name="default_resolution_title">Resolución por defecto</string>
|
||||||
<string name="play_with_kodi_title">Reproducir con Kodi</string>
|
<string name="play_with_kodi_title">Reproducir con Kodi</string>
|
||||||
<string name="kore_not_found">Aplicación Kore no encontrada. ¿Instalar Kore?</string>
|
<string name="kore_not_found">Aplicación Kore no encontrada. ¿Instalar Kore?</string>
|
||||||
<string name="installeKore">Instalar Kore</string>
|
|
||||||
<string name="show_play_with_kodi_title">Mostrar opción \"Reproducir con Kodi\"</string>
|
<string name="show_play_with_kodi_title">Mostrar opción \"Reproducir con Kodi\"</string>
|
||||||
<string name="show_play_with_kodi_summary">Muestra una opción para reproducir el vídeo con Kodi Media Center.</string>
|
<string name="show_play_with_kodi_summary">Muestra una opción para reproducir el vídeo con Kodi Media Center.</string>
|
||||||
<string name="play_audio">Audio</string>
|
<string name="play_audio">Audio</string>
|
||||||
|
@ -159,143 +155,6 @@
|
||||||
<string name="title_activity_channel">Actividad del canal</string>
|
<string name="title_activity_channel">Actividad del canal</string>
|
||||||
<string name="action_settings">Ajustes</string>
|
<string name="action_settings">Ajustes</string>
|
||||||
|
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="black_theme_title">Oscuro</string>
|
<string name="black_theme_title">Oscuro</string>
|
||||||
|
|
||||||
<string name="all">Todo</string>
|
<string name="all">Todo</string>
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
<string name="default_resolution_title">Lehenetsitako bereizmena</string>
|
<string name="default_resolution_title">Lehenetsitako bereizmena</string>
|
||||||
<string name="play_with_kodi_title">Kodirekin erreproduzitu</string>
|
<string name="play_with_kodi_title">Kodirekin erreproduzitu</string>
|
||||||
<string name="kore_not_found">Kore aplikazioa ez da aurkitu. Kore beharrezkoa da Kodi multimedia zentroarekin bideoak erreproduzitzeko.</string>
|
<string name="kore_not_found">Kore aplikazioa ez da aurkitu. Kore beharrezkoa da Kodi multimedia zentroarekin bideoak erreproduzitzeko.</string>
|
||||||
<string name="installeKore">Kore instalatu</string>
|
|
||||||
<string name="show_play_with_kodi_title">\"Kodirekin erreproduzitu\" aukera erakutsi</string>
|
<string name="show_play_with_kodi_title">\"Kodirekin erreproduzitu\" aukera erakutsi</string>
|
||||||
<string name="show_play_with_kodi_summary">Kodi multimedia zentroarekin bideoa erreproduzitzeko aukera erakusten du.</string>
|
<string name="show_play_with_kodi_summary">Kodi multimedia zentroarekin bideoa erreproduzitzeko aukera erakusten du.</string>
|
||||||
<string name="play_audio">Audioa</string>
|
<string name="play_audio">Audioa</string>
|
||||||
|
@ -48,8 +47,6 @@
|
||||||
<string name="search_page">"Orrialdea bilatu: "</string>
|
<string name="search_page">"Orrialdea bilatu: "</string>
|
||||||
<string name="use_external_video_player_title">Kanpoko bideo erreproduzitzailea erabili</string>
|
<string name="use_external_video_player_title">Kanpoko bideo erreproduzitzailea erabili</string>
|
||||||
<string name="use_external_audio_player_title">Kanpoko audio erreproduzitzailea erabili</string>
|
<string name="use_external_audio_player_title">Kanpoko audio erreproduzitzailea erabili</string>
|
||||||
<string name="autoplay_through_intent_title">Intent bidez automatikoki erreproduzitu</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Bideoa automatikoki hasten du beste aplikazio batetik deitu denean.</string>
|
|
||||||
<string name="background_player_playing_toast">Atzeko planoan erreproduzitzen</string>
|
<string name="background_player_playing_toast">Atzeko planoan erreproduzitzen</string>
|
||||||
<string name="main_bg_subtitle">Ukitu bilaketa hasteko</string>
|
<string name="main_bg_subtitle">Ukitu bilaketa hasteko</string>
|
||||||
<string name="download_path_audio_title">Audioa deskargatzeko kokapena</string>
|
<string name="download_path_audio_title">Audioa deskargatzeko kokapena</string>
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
<string name="autoplay_through_intent_summary">Lire automatiquement une vidéo lorsqu’elle a été appelée depuis une autre application.</string>
|
|
||||||
<string name="cancel">Annuler</string>
|
<string name="cancel">Annuler</string>
|
||||||
<string name="choose_browser">Choisir un navigateur </string>
|
<string name="choose_browser">Choisir un navigateur </string>
|
||||||
<string name="default_resolution_title">Définition par défaut</string>
|
<string name="default_resolution_title">Définition par défaut</string>
|
||||||
|
@ -10,11 +9,9 @@
|
||||||
<string name="download_path_dialog_title">Entrer le chemin de téléchargement des vidéos</string>
|
<string name="download_path_dialog_title">Entrer le chemin de téléchargement des vidéos</string>
|
||||||
<string name="download_path_summary">Chemin de stockage des vidéos téléchargées.</string>
|
<string name="download_path_summary">Chemin de stockage des vidéos téléchargées.</string>
|
||||||
<string name="install">Installer</string>
|
<string name="install">Installer</string>
|
||||||
<string name="installeKore">Installer Kore</string>
|
|
||||||
<string name="kore_not_found">L’application Kore est introuvable. Installer Kore ?</string>
|
<string name="kore_not_found">L’application Kore est introuvable. Installer Kore ?</string>
|
||||||
<string name="no_player_found">Aucun lecteur de flux réseau trouvé. Installer VLC ?</string>
|
<string name="no_player_found">Aucun lecteur de flux réseau trouvé. Installer VLC ?</string>
|
||||||
<string name="open_in_browser">Ouvrir dans le navigateur</string>
|
<string name="open_in_browser">Ouvrir dans le navigateur</string>
|
||||||
<string name="autoplay_through_intent_title">Lecture automatique via Intent</string>
|
|
||||||
<string name="play_with_kodi_title">Lire avec Kodi</string>
|
<string name="play_with_kodi_title">Lire avec Kodi</string>
|
||||||
<string name="screen_rotation">rotation</string>
|
<string name="screen_rotation">rotation</string>
|
||||||
<string name="search">Rechercher</string>
|
<string name="search">Rechercher</string>
|
||||||
|
@ -26,7 +23,6 @@
|
||||||
<string name="show_play_with_kodi_title">Afficher l’option « Lire avec Kodi »</string>
|
<string name="show_play_with_kodi_title">Afficher l’option « Lire avec Kodi »</string>
|
||||||
<string name="settings_activity_title">Paramètres</string>
|
<string name="settings_activity_title">Paramètres</string>
|
||||||
<string name="upload_date_text">Ajoutée le %1$s</string>
|
<string name="upload_date_text">Ajoutée le %1$s</string>
|
||||||
<string name="useExternalPlayerTitle">Utiliser un lecteur externe</string>
|
|
||||||
<string name="view_count_text">%1$s vues</string>
|
<string name="view_count_text">%1$s vues</string>
|
||||||
<string name="play_audio">Audio</string>
|
<string name="play_audio">Audio</string>
|
||||||
<string name="default_audio_format_title">Format audio par défaut</string>
|
<string name="default_audio_format_title">Format audio par défaut</string>
|
||||||
|
|
|
@ -16,16 +16,12 @@
|
||||||
<string name="choose_browser">Válasszon böngészőt</string>
|
<string name="choose_browser">Válasszon böngészőt</string>
|
||||||
<string name="screen_rotation">forgatás</string>
|
<string name="screen_rotation">forgatás</string>
|
||||||
<string name="settings_activity_title">Beállítások</string>
|
<string name="settings_activity_title">Beállítások</string>
|
||||||
<string name="useExternalPlayerTitle">Külső lejátszó használata</string>
|
|
||||||
<string name="download_path_title">Videófájlok letöltési helye</string>
|
<string name="download_path_title">Videófájlok letöltési helye</string>
|
||||||
<string name="download_path_summary">Útvonal a letöltött videók tárolásához.</string>
|
<string name="download_path_summary">Útvonal a letöltött videók tárolásához.</string>
|
||||||
<string name="download_path_dialog_title">Adja meg a videófájlok letöltési helyét</string>
|
<string name="download_path_dialog_title">Adja meg a videófájlok letöltési helyét</string>
|
||||||
<string name="autoplay_through_intent_title">Automatikus lejátszás Intent-en keresztül</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Videó automatikus lejátszása külső alkalmazással való megnyitás esetén.</string>
|
|
||||||
<string name="default_resolution_title">Alapértelmezett felbontás</string>
|
<string name="default_resolution_title">Alapértelmezett felbontás</string>
|
||||||
<string name="play_with_kodi_title">Lejátszás Kodi-val</string>
|
<string name="play_with_kodi_title">Lejátszás Kodi-val</string>
|
||||||
<string name="kore_not_found">A Kore alkalmazás nem található. Feltelepíti a Kore lejátszót?</string>
|
<string name="kore_not_found">A Kore alkalmazás nem található. Feltelepíti a Kore lejátszót?</string>
|
||||||
<string name="installeKore">Kore telepítése</string>
|
|
||||||
<string name="show_play_with_kodi_title">\"Lejátszás Kodi-val\" opció mutatása</string>
|
<string name="show_play_with_kodi_title">\"Lejátszás Kodi-val\" opció mutatása</string>
|
||||||
<string name="show_play_with_kodi_summary">Mutat egy opciót a videók Kodi médiaközponttal való lejátszására.</string>
|
<string name="show_play_with_kodi_summary">Mutat egy opciót a videók Kodi médiaközponttal való lejátszására.</string>
|
||||||
<string name="play_audio">Hang</string>
|
<string name="play_audio">Hang</string>
|
||||||
|
|
|
@ -151,143 +151,6 @@
|
||||||
<string name="user_report">Laporan pengguna</string>
|
<string name="user_report">Laporan pengguna</string>
|
||||||
|
|
||||||
<string name="msg_threads">Thread</string>
|
<string name="msg_threads">Thread</string>
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||||
<string name="reCaptcha_title">Rintangan reCAPTCHA</string>
|
<string name="reCaptcha_title">Rintangan reCAPTCHA</string>
|
||||||
|
|
||||||
|
|
|
@ -16,16 +16,12 @@
|
||||||
<string name="choose_browser">Scegli browser</string>
|
<string name="choose_browser">Scegli browser</string>
|
||||||
<string name="screen_rotation">rotazione</string>
|
<string name="screen_rotation">rotazione</string>
|
||||||
<string name="settings_activity_title">Impostazioni</string>
|
<string name="settings_activity_title">Impostazioni</string>
|
||||||
<string name="useExternalPlayerTitle">Usa un riproduttore video esterno</string>
|
|
||||||
<string name="download_path_title">Cartella dei video scaricati</string>
|
<string name="download_path_title">Cartella dei video scaricati</string>
|
||||||
<string name="download_path_summary">Percorso dove memorizzare i video scaricati.</string>
|
<string name="download_path_summary">Percorso dove memorizzare i video scaricati.</string>
|
||||||
<string name="download_path_dialog_title">Inserisci il percorso per i download</string>
|
<string name="download_path_dialog_title">Inserisci il percorso per i download</string>
|
||||||
<string name="autoplay_through_intent_title">Auto riproduzione attraverso internet</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Avvia automaticamente un video quando è stato chiamato da un\'altra applicazione.</string>
|
|
||||||
<string name="default_resolution_title">Risoluzione predefinita</string>
|
<string name="default_resolution_title">Risoluzione predefinita</string>
|
||||||
<string name="play_with_kodi_title">Riproduci con Kodi</string>
|
<string name="play_with_kodi_title">Riproduci con Kodi</string>
|
||||||
<string name="kore_not_found">L\'applicazione Kore non è stata trovata. Kore è necessario per riprodurre video con Kodi media center. Vorresti installarlo?</string>
|
<string name="kore_not_found">L\'applicazione Kore non è stata trovata. Kore è necessario per riprodurre video con Kodi media center. Vorresti installarlo?</string>
|
||||||
<string name="installeKore">Installa Kore</string>
|
|
||||||
<string name="show_play_with_kodi_title">Mostra l\'opzione \"Riproduci con Kodi\"</string>
|
<string name="show_play_with_kodi_title">Mostra l\'opzione \"Riproduci con Kodi\"</string>
|
||||||
<string name="show_play_with_kodi_summary">Mostra un opzione per riprodurre un video attraverso Kodi media center.</string>
|
<string name="show_play_with_kodi_summary">Mostra un opzione per riprodurre un video attraverso Kodi media center.</string>
|
||||||
<string name="play_audio">Audio</string>
|
<string name="play_audio">Audio</string>
|
||||||
|
@ -39,8 +35,6 @@
|
||||||
<string name="similar_videos_btn_text">Video simili</string>
|
<string name="similar_videos_btn_text">Video simili</string>
|
||||||
<string name="search_language_title">Lingua preferita per i contenuti</string>
|
<string name="search_language_title">Lingua preferita per i contenuti</string>
|
||||||
<string name="settings_category_video_audio_title">Video e Audio</string>
|
<string name="settings_category_video_audio_title">Video e Audio</string>
|
||||||
<string name="settingsCategoryVideoInfoTittle">INFO</string>
|
|
||||||
<string name="settingsCategoryEtcTitle">ETC</string>
|
|
||||||
|
|
||||||
<string name="list_thumbnail_view_description">Anteprima video</string>
|
<string name="list_thumbnail_view_description">Anteprima video</string>
|
||||||
<string name="detail_thumbnail_view_description">Anteprima video</string>
|
<string name="detail_thumbnail_view_description">Anteprima video</string>
|
||||||
|
@ -164,143 +158,6 @@
|
||||||
<string name="action_settings">Impostazioni</string>
|
<string name="action_settings">Impostazioni</string>
|
||||||
|
|
||||||
<string name="title_activity_channel">ChannelActivity</string>
|
<string name="title_activity_channel">ChannelActivity</string>
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||||
<string name="reCaptcha_title">Sfida reCAPTCHA</string>
|
<string name="reCaptcha_title">Sfida reCAPTCHA</string>
|
||||||
|
|
||||||
|
|
|
@ -15,16 +15,12 @@
|
||||||
<string name="choose_browser">ブラウザーを選択</string>
|
<string name="choose_browser">ブラウザーを選択</string>
|
||||||
<string name="screen_rotation">回転</string>
|
<string name="screen_rotation">回転</string>
|
||||||
<string name="settings_activity_title">設定</string>
|
<string name="settings_activity_title">設定</string>
|
||||||
<string name="useExternalPlayerTitle">外部プレーヤーを使用する</string>
|
|
||||||
<string name="download_path_title">動画を保存する場所</string>
|
<string name="download_path_title">動画を保存する場所</string>
|
||||||
<string name="download_path_summary">動画を保存する位置</string>
|
<string name="download_path_summary">動画を保存する位置</string>
|
||||||
<string name="download_path_dialog_title">動画を保存する場所を入力して下さい</string>
|
<string name="download_path_dialog_title">動画を保存する場所を入力して下さい</string>
|
||||||
<string name="autoplay_through_intent_title">インテントで自動再生</string>
|
|
||||||
<string name="autoplay_through_intent_summary">他のアプリケーションから呼び出されたとき、自動的に動画再生を開始します。</string>
|
|
||||||
<string name="default_resolution_title">基本解像度</string>
|
<string name="default_resolution_title">基本解像度</string>
|
||||||
<string name="play_with_kodi_title">Kodi で再生</string>
|
<string name="play_with_kodi_title">Kodi で再生</string>
|
||||||
<string name="kore_not_found">Koreが見つかりません。Kore を入手しますか。</string>
|
<string name="kore_not_found">Koreが見つかりません。Kore を入手しますか。</string>
|
||||||
<string name="installeKore">Kore をインストール</string>
|
|
||||||
<string name="show_play_with_kodi_title">\"Kodi で再生\" 設定を表示</string>
|
<string name="show_play_with_kodi_title">\"Kodi で再生\" 設定を表示</string>
|
||||||
<string name="show_play_with_kodi_summary">Kodi メディアセンター経由で動画を再生するための設定を表示します</string>
|
<string name="show_play_with_kodi_summary">Kodi メディアセンター経由で動画を再生するための設定を表示します</string>
|
||||||
<string name="play_audio">音楽</string>
|
<string name="play_audio">音楽</string>
|
||||||
|
@ -162,143 +158,6 @@
|
||||||
|
|
||||||
<string name="app_ui_crash">アプリ/UI がクラッシュしました</string>
|
<string name="app_ui_crash">アプリ/UI がクラッシュしました</string>
|
||||||
<string name="info_labels">何:\\n提案:\\nコンテンツ言語:\\nサービス:\\nGMT 時間:\\nパッケージ:\\nバージョン:\\nOS バージョン:\\nグローバル IP 範囲:</string>
|
<string name="info_labels">何:\\n提案:\\nコンテンツ言語:\\nサービス:\\nGMT 時間:\\nパッケージ:\\nバージョン:\\nOS バージョン:\\nグローバル IP 範囲:</string>
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||||
<string name="reCaptcha_title">reCAPTCHA の要求</string>
|
<string name="reCaptcha_title">reCAPTCHA の要求</string>
|
||||||
|
|
||||||
|
|
|
@ -16,16 +16,12 @@
|
||||||
<string name="choose_browser">브라우저 선택</string>
|
<string name="choose_browser">브라우저 선택</string>
|
||||||
<string name="screen_rotation">회전</string>
|
<string name="screen_rotation">회전</string>
|
||||||
<string name="settings_activity_title">설정</string>
|
<string name="settings_activity_title">설정</string>
|
||||||
<string name="useExternalPlayerTitle">외부 플레이어 사용</string>
|
|
||||||
<string name="download_path_title">비디오 다운로드 위치</string>
|
<string name="download_path_title">비디오 다운로드 위치</string>
|
||||||
<string name="download_path_summary">다운로드된 비디오가 저장될 경로를 선택하세요.</string>
|
<string name="download_path_summary">다운로드된 비디오가 저장될 경로를 선택하세요.</string>
|
||||||
<string name="download_path_dialog_title">비디오 다운로드 경로 입력</string>
|
<string name="download_path_dialog_title">비디오 다운로드 경로 입력</string>
|
||||||
<string name="autoplay_through_intent_title">인텐트로 경유할 경우 자동 재생</string>
|
|
||||||
<string name="autoplay_through_intent_summary">다른 앱으로부터 호출되었을 경우에 비디오를 자동으로 재생합니다.</string>
|
|
||||||
<string name="default_resolution_title">기본 해상도</string>
|
<string name="default_resolution_title">기본 해상도</string>
|
||||||
<string name="play_with_kodi_title">Kodi로 재생</string>
|
<string name="play_with_kodi_title">Kodi로 재생</string>
|
||||||
<string name="kore_not_found">Kore 앱이 발견되지 않았습니다. Kore를 설치할까요?</string>
|
<string name="kore_not_found">Kore 앱이 발견되지 않았습니다. Kore를 설치할까요?</string>
|
||||||
<string name="installeKore">Kore 설치</string>
|
|
||||||
<string name="show_play_with_kodi_title">\"Kodi로 재생\" 옵션 표시</string>
|
<string name="show_play_with_kodi_title">\"Kodi로 재생\" 옵션 표시</string>
|
||||||
<string name="show_play_with_kodi_summary">비디오를 Kodi media center를 사용해 재생하는 옵션을 표시합니다.</string>
|
<string name="show_play_with_kodi_summary">비디오를 Kodi media center를 사용해 재생하는 옵션을 표시합니다.</string>
|
||||||
<string name="play_audio">오디오</string>
|
<string name="play_audio">오디오</string>
|
||||||
|
@ -39,8 +35,6 @@
|
||||||
<string name="similar_videos_btn_text">유사한 비디오</string>
|
<string name="similar_videos_btn_text">유사한 비디오</string>
|
||||||
<string name="search_language_title">선호하는 컨텐츠 언어</string>
|
<string name="search_language_title">선호하는 컨텐츠 언어</string>
|
||||||
<string name="settings_category_video_audio_title">비디오 & 오디오</string>
|
<string name="settings_category_video_audio_title">비디오 & 오디오</string>
|
||||||
<string name="settingsCategoryVideoInfoTittle">정보</string>
|
|
||||||
<string name="settingsCategoryEtcTitle">기타</string>
|
|
||||||
|
|
||||||
<string name="list_thumbnail_view_description">비디오 미리보기 썸네일</string>
|
<string name="list_thumbnail_view_description">비디오 미리보기 썸네일</string>
|
||||||
<string name="detail_thumbnail_view_description">비디오 미리보기 썸네일</string>
|
<string name="detail_thumbnail_view_description">비디오 미리보기 썸네일</string>
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
<string name="download_path_audio_summary">Sti å lagre nedlastet lyd i.</string>
|
<string name="download_path_audio_summary">Sti å lagre nedlastet lyd i.</string>
|
||||||
<string name="download_path_audio_dialog_title">Skriv inn nedlastingssti for lydfiler.</string>
|
<string name="download_path_audio_dialog_title">Skriv inn nedlastingssti for lydfiler.</string>
|
||||||
|
|
||||||
<string name="autoplay_through_intent_summary">Automatisk avspilling av video når det blir forespurt fra et annet program.</string>
|
|
||||||
<string name="default_resolution_title">Forvalgt oppløsning</string>
|
<string name="default_resolution_title">Forvalgt oppløsning</string>
|
||||||
<string name="play_with_kodi_title">Spill av med Kodi</string>
|
<string name="play_with_kodi_title">Spill av med Kodi</string>
|
||||||
<string name="kore_not_found">Kore-programmet ble ikke funnet. Installer Kore?</string>
|
<string name="kore_not_found">Kore-programmet ble ikke funnet. Installer Kore?</string>
|
||||||
|
@ -65,7 +64,6 @@
|
||||||
|
|
||||||
<string name="err_dir_create">Kan ikke opprette nedlastingsmappe \'%1$s\'</string>
|
<string name="err_dir_create">Kan ikke opprette nedlastingsmappe \'%1$s\'</string>
|
||||||
<string name="info_dir_created">Opprettet nedlastingsmappen \'%1$s\'</string>
|
<string name="info_dir_created">Opprettet nedlastingsmappen \'%1$s\'</string>
|
||||||
<string name="autoplay_through_intent_title">Automatisk avspilling med Intent</string>
|
|
||||||
<string name="main_bg_subtitle">Trykk for å komme i gang</string>
|
<string name="main_bg_subtitle">Trykk for å komme i gang</string>
|
||||||
<string name="autoplay_by_calling_app_title">Automatisk avspilling når forespurt av et annet program</string>
|
<string name="autoplay_by_calling_app_title">Automatisk avspilling når forespurt av et annet program</string>
|
||||||
<string name="autoplay_by_calling_app_summary">Automatisk avspilling av video når NewPipe blir forespurt av et annet program.</string>
|
<string name="autoplay_by_calling_app_summary">Automatisk avspilling av video når NewPipe blir forespurt av et annet program.</string>
|
||||||
|
|
|
@ -16,16 +16,12 @@
|
||||||
<string name="choose_browser">Kies een browser</string>
|
<string name="choose_browser">Kies een browser</string>
|
||||||
<string name="screen_rotation">rotatie</string>
|
<string name="screen_rotation">rotatie</string>
|
||||||
<string name="settings_activity_title">Instellingen</string>
|
<string name="settings_activity_title">Instellingen</string>
|
||||||
<string name="useExternalPlayerTitle">Gebruik externe speler</string>
|
|
||||||
<string name="download_path_title">Downloadlocatie voor video\'s</string>
|
<string name="download_path_title">Downloadlocatie voor video\'s</string>
|
||||||
<string name="download_path_summary">Locatie om gedownloade video\'s in op te slaan.</string>
|
<string name="download_path_summary">Locatie om gedownloade video\'s in op te slaan.</string>
|
||||||
<string name="download_path_dialog_title">Voer downloadlocatie in voor video\'s</string>
|
<string name="download_path_dialog_title">Voer downloadlocatie in voor video\'s</string>
|
||||||
<string name="autoplay_through_intent_title">Speel automatisch via Intent</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Speel een video automatisch af indien geopend vanuit een andere app.</string>
|
|
||||||
<string name="default_resolution_title">Standaardresolutie</string>
|
<string name="default_resolution_title">Standaardresolutie</string>
|
||||||
<string name="play_with_kodi_title">Afspelen met Kodi</string>
|
<string name="play_with_kodi_title">Afspelen met Kodi</string>
|
||||||
<string name="kore_not_found">Kore-app niet gevonden. Kore installeren?</string>
|
<string name="kore_not_found">Kore-app niet gevonden. Kore installeren?</string>
|
||||||
<string name="installeKore">Installeer Kore</string>
|
|
||||||
<string name="show_play_with_kodi_title">Toon \"Afspelen met Kodi\"-optie</string>
|
<string name="show_play_with_kodi_title">Toon \"Afspelen met Kodi\"-optie</string>
|
||||||
<string name="show_play_with_kodi_summary">Toont een optie om een video op een Kodi media center af te spelen.</string>
|
<string name="show_play_with_kodi_summary">Toont een optie om een video op een Kodi media center af te spelen.</string>
|
||||||
<string name="play_audio">Audio</string>
|
<string name="play_audio">Audio</string>
|
||||||
|
@ -157,143 +153,6 @@
|
||||||
<string name="title_activity_channel">ChannelActivity</string>
|
<string name="title_activity_channel">ChannelActivity</string>
|
||||||
<string name="action_settings">Instellingen</string>
|
<string name="action_settings">Instellingen</string>
|
||||||
|
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="black_theme_title">Zwart</string>
|
<string name="black_theme_title">Zwart</string>
|
||||||
|
|
||||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||||
|
|
|
@ -21,12 +21,9 @@
|
||||||
<string name="download_path_title">Descarga de vídeos</string>
|
<string name="download_path_title">Descarga de vídeos</string>
|
||||||
<string name="download_path_summary">Local para guardar os vídeos descarregados.</string>
|
<string name="download_path_summary">Local para guardar os vídeos descarregados.</string>
|
||||||
<string name="download_path_dialog_title">Digite o caminho para os vídeos</string>
|
<string name="download_path_dialog_title">Digite o caminho para os vídeos</string>
|
||||||
<string name="autoplay_through_intent_title">Reproduzir através de Intent</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Reproduzir automaticamente o vídeo se invocado por outra aplicação.</string>
|
|
||||||
<string name="default_resolution_title">Resolução padrão</string>
|
<string name="default_resolution_title">Resolução padrão</string>
|
||||||
<string name="play_with_kodi_title">Reproduzir com Kodi</string>
|
<string name="play_with_kodi_title">Reproduzir com Kodi</string>
|
||||||
<string name="kore_not_found">Aplicação não encontrada. Instalar o Kore?</string>
|
<string name="kore_not_found">Aplicação não encontrada. Instalar o Kore?</string>
|
||||||
<string name="installeKore">Instalar o Kore</string>
|
|
||||||
<string name="show_play_with_kodi_title">Mostrar opção \"Reproduzir com Kodi\"</string>
|
<string name="show_play_with_kodi_title">Mostrar opção \"Reproduzir com Kodi\"</string>
|
||||||
<string name="show_play_with_kodi_summary">Mostra uma opção para reproduzir o vídeo com o Kodi.</string>
|
<string name="show_play_with_kodi_summary">Mostra uma opção para reproduzir o vídeo com o Kodi.</string>
|
||||||
<string name="play_audio">Áudio</string>
|
<string name="play_audio">Áudio</string>
|
||||||
|
@ -40,8 +37,6 @@
|
||||||
<string name="similar_videos_btn_text">Vídeos similares</string>
|
<string name="similar_videos_btn_text">Vídeos similares</string>
|
||||||
<string name="search_language_title">Idioma preferencial do conteúdo</string>
|
<string name="search_language_title">Idioma preferencial do conteúdo</string>
|
||||||
<string name="settings_category_video_audio_title">Vídeo e áudio</string>
|
<string name="settings_category_video_audio_title">Vídeo e áudio</string>
|
||||||
<string name="settingsCategoryVideoInfoTittle">Informações</string>
|
|
||||||
<string name="settingsCategoryEtcTitle">Outras</string>
|
|
||||||
|
|
||||||
<string name="list_thumbnail_view_description">Miniatura de vídeos</string>
|
<string name="list_thumbnail_view_description">Miniatura de vídeos</string>
|
||||||
<string name="detail_thumbnail_view_description">Miniatura de vídeos</string>
|
<string name="detail_thumbnail_view_description">Miniatura de vídeos</string>
|
||||||
|
@ -158,143 +153,6 @@
|
||||||
<string name="app_ui_crash">Aplicação encerrada</string>
|
<string name="app_ui_crash">Aplicação encerrada</string>
|
||||||
<string name="info_labels">O quê:\\nPedido:\\nIdioma do conteúdo:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO:\\nIP global:</string>
|
<string name="info_labels">O quê:\\nPedido:\\nIdioma do conteúdo:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO:\\nIP global:</string>
|
||||||
<string name="title_activity_channel">Atividade do canal</string>
|
<string name="title_activity_channel">Atividade do canal</string>
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="open_in_popup_mode">Abrir no modo “popup“</string>
|
<string name="open_in_popup_mode">Abrir no modo “popup“</string>
|
||||||
<string name="black_theme_title">Preto</string>
|
<string name="black_theme_title">Preto</string>
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,6 @@
|
||||||
<string name="download_path_audio_summary">Locul în care se vor stoca fișierele audio descărcate</string>
|
<string name="download_path_audio_summary">Locul în care se vor stoca fișierele audio descărcate</string>
|
||||||
<string name="download_path_audio_dialog_title">Introduceți calea de descărcare pentru fișierele audio.</string>
|
<string name="download_path_audio_dialog_title">Introduceți calea de descărcare pentru fișierele audio.</string>
|
||||||
|
|
||||||
<string name="autoplay_through_intent_title">Redare automată intenționată</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Redați automat un videoclip atunci când este chemat din altă aplicație.</string>
|
|
||||||
<string name="default_resolution_title">Rezoluție implicită</string>
|
<string name="default_resolution_title">Rezoluție implicită</string>
|
||||||
<string name="play_with_kodi_title">Redați folosind Kodi</string>
|
<string name="play_with_kodi_title">Redați folosind Kodi</string>
|
||||||
<string name="kore_not_found">Aplicația Kore nu a fost găsită. Instalați Kore?</string>
|
<string name="kore_not_found">Aplicația Kore nu a fost găsită. Instalați Kore?</string>
|
||||||
|
|
|
@ -16,16 +16,12 @@
|
||||||
<string name="choose_browser">Выбрать браузер</string>
|
<string name="choose_browser">Выбрать браузер</string>
|
||||||
<string name="screen_rotation">поворот</string>
|
<string name="screen_rotation">поворот</string>
|
||||||
<string name="settings_activity_title">Настройки</string>
|
<string name="settings_activity_title">Настройки</string>
|
||||||
<string name="useExternalPlayerTitle">Использовать внешний проигрыватель</string>
|
|
||||||
<string name="download_path_title">Место для загрузок</string>
|
<string name="download_path_title">Место для загрузок</string>
|
||||||
<string name="download_path_summary">Папка для хранения загруженных видео</string>
|
<string name="download_path_summary">Папка для хранения загруженных видео</string>
|
||||||
<string name="download_path_dialog_title">Введите путь к папке для загрузки видео</string>
|
<string name="download_path_dialog_title">Введите путь к папке для загрузки видео</string>
|
||||||
<string name="autoplay_through_intent_title">Автопроигрывание через интернет</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Автоматически воспроизводить видео, открытое через другое приложение</string>
|
|
||||||
<string name="default_resolution_title">Разрешение по-умолчанию</string>
|
<string name="default_resolution_title">Разрешение по-умолчанию</string>
|
||||||
<string name="play_with_kodi_title">Воспроизвести с помощью Kodi</string>
|
<string name="play_with_kodi_title">Воспроизвести с помощью Kodi</string>
|
||||||
<string name="kore_not_found">Приложение Kore не наидено. Установить Kore?</string>
|
<string name="kore_not_found">Приложение Kore не наидено. Установить Kore?</string>
|
||||||
<string name="installeKore">Установить Kore</string>
|
|
||||||
<string name="show_play_with_kodi_title">Показывать опцию \"Воспроизвести с помощью Kodi\"</string>
|
<string name="show_play_with_kodi_title">Показывать опцию \"Воспроизвести с помощью Kodi\"</string>
|
||||||
<string name="show_play_with_kodi_summary">Показать опцию воспроизведения видео через Kodi media center</string>
|
<string name="show_play_with_kodi_summary">Показать опцию воспроизведения видео через Kodi media center</string>
|
||||||
<string name="play_audio">Аудио</string>
|
<string name="play_audio">Аудио</string>
|
||||||
|
|
|
@ -29,8 +29,6 @@
|
||||||
<string name="download_path_audio_dialog_title">Vložte cestu kam sa budú ukladať zvukové súbory.</string>
|
<string name="download_path_audio_dialog_title">Vložte cestu kam sa budú ukladať zvukové súbory.</string>
|
||||||
|
|
||||||
<string name="download_path_audio_summary">Cesta kam sa bude ukladať prevzaté audio</string>
|
<string name="download_path_audio_summary">Cesta kam sa bude ukladať prevzaté audio</string>
|
||||||
<string name="autoplay_through_intent_title">Automatické prehrávanie na vyžiadanie</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Automatický prehrá video na žiadosť z inej aplikácie.</string>
|
|
||||||
<string name="default_resolution_title">Štandardné rozlíšenie</string>
|
<string name="default_resolution_title">Štandardné rozlíšenie</string>
|
||||||
<string name="play_with_kodi_title">Prehrať cez Kodi</string>
|
<string name="play_with_kodi_title">Prehrať cez Kodi</string>
|
||||||
<string name="kore_not_found">Aplikácia Kore nenajdená. Inštalovať Kore?</string>
|
<string name="kore_not_found">Aplikácia Kore nenajdená. Inštalovať Kore?</string>
|
||||||
|
@ -155,143 +153,6 @@
|
||||||
<string name="title_activity_channel">Aktivita kanálov</string>
|
<string name="title_activity_channel">Aktivita kanálov</string>
|
||||||
<string name="action_settings">Nastavenia</string>
|
<string name="action_settings">Nastavenia</string>
|
||||||
|
|
||||||
<string name="large_text">"
|
|
||||||
Materiál je metaforou.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Materiál metafora je zjednocujúci teórie racionálne priestoru a systém pohybu.
|
|
||||||
Materiál je zakotvená v taktilné skutočnosti, inšpirované štúdiom papiera a atramentu, ale napriek tomu
|
|
||||||
technologicky pokročilé a otvorené fantáziu a mágiu.
|
|
||||||
|
|
||||||
Povrchy a hrany materiálu poskytujú vizuálnu pokyny, ktoré sú zakotvené v realite.
|
|
||||||
Použitie známych hmatových vlastností, pomáha používateľom rýchlo pochopiť affordances. napriek tomu
|
|
||||||
Pružnosť materiálu vytvára nové affordances že nadradené tie fyzické
|
|
||||||
svet bez toho, aby porušenie pravidiel fyziky.
|
|
||||||
|
|
||||||
Základy svetla, povrchu a pohyb sú kľúčom k dopravovanie, ako sa objekty pohybovať,
|
|
||||||
komunikovať, a existujú v priestore a vo vzťahu k sebe navzájom. Realistické svetelné šou
|
|
||||||
švy, rozdeľuje priestor, a indikuje pohyblivých častí.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, kreslený, úmyselné.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Foundational prvky tlače na dizajn typografie, rošty, priestor, mierka, farby,
|
|
||||||
a používanie metafor riadiť vizuálne procedúry. Tieto prvky robiť oveľa viac, než potešiť
|
|
||||||
oko. Vytvárajú hierarchie, zmysel a zameranie. výber farieb úmyselné, od okraja k okraju
|
|
||||||
snímok, rozsiahle typografie a úmyselné biely priestor vytvoriť tučný a grafický
|
|
||||||
rozhranie, ktoré ponorí užívateľov v zážitku.
|
|
||||||
|
|
||||||
Dôraz na užívateľských akcií činí základné funkcie okamžite zrejmé a poskytuje
|
|
||||||
waypointy pre užívateľov.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion poskytuje význam.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Návrh rešpektuje a posilňuje užívateľa ako hnacia sila. Primárne akcie užívateľa sú
|
|
||||||
inflexné body, ktoré iniciujú pohyb, transformáciu celej konštrukcie.
|
|
||||||
|
|
||||||
Celá akcia prebieha v jedinom prostredí. Objekty sú prezentované užívateľovi bez toho,
|
|
||||||
prelomenie kontinuity skúseností, aj keď ich transformáciu a reorganizáciu.
|
|
||||||
|
|
||||||
Pohyb je zmysluplné a vhodné, slúžiace sústrediť pozornosť a zachovanie kontinuity.
|
|
||||||
Spätná väzba je jemné, ale napriek tomu jasné. Prechody sú ef fi točné ešte koherentné.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D svet.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Materiál prostredie je 3D priestore, čo znamená, že všetky objekty majú X, Y, a Z
|
|
||||||
rozmery. Os je kolmo zarovnaný k rovine zobrazenie, s
|
|
||||||
kladná os rozširuje smerom k divákovi. Každý list materiálu, umiestnené v jednom
|
|
||||||
poloha pozdĺž osi a má štandardnú hrúbku 1DP.
|
|
||||||
|
|
||||||
Na webe, os sa používa pre vrstvenie a nie pre perspektívy. 3D svet
|
|
||||||
emuloval tým, že manipuluje os y.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Svetlo a tieň.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
V hmotnom prostredí, virtuálne svetlá osvetľujú scénu. Kľúčové svetla vytvárajú
|
|
||||||
smerové tiene, zatiaľ čo okolité svetlo vytvára mäkké tiene zo všetkých strán.
|
|
||||||
|
|
||||||
Tiene v hmotnom prostredí sú obsadené týmito dvoma svetelnými zdrojmi. v Android
|
|
||||||
vývoj, dochádza tiene, keď sú svetelné zdroje blokované plechového materiálu, na
|
|
||||||
Rôzne pozície pozdĺž osi. Na webe tiene sú znázornené manipuláciou
|
|
||||||
Iba os y. Nasledujúci príklad ukazuje kartu s výškou 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Odpočíva nadmorskú výšku.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Všetky významné objekty, bez ohľadu na ich veľkosť, majú výšku odpočíva, alebo predvolené výšku
|
|
||||||
to nič nemení. V prípade, že objekt sa mení výšku, mal by sa vrátiť do svojej pokojovej
|
|
||||||
nadmorskej výšky čo najskôr.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component výškach.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Pokojová nadmorská výška pre typ komponentu je konzistentné naprieč aplikáciami (napr FAB elevácie
|
|
||||||
nelíši od 6dp v jednej aplikácii na 16dp v inej aplikácii).
|
|
||||||
|
|
||||||
Zložky môžu mať rôzne pokojovej výšky medzi platformami, v závislosti od hĺbky
|
|
||||||
životného prostredia (napr televízor má väčšiu hĺbku, ako mobilný telefón alebo plochy).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Citlivé nadmorská výška a dynamické elevácie offsety.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Niektoré typy komponentov majú citlivejší výšku, čo znamená, že meniť výšku v odozve
|
|
||||||
na vstup používateľa (napríklad normálny priebeh, sa zameral, a lisované), alebo systémové udalosti. tieto elevácie
|
|
||||||
Zmeny sa vykonávali dôsledne používať dynamické výškové posuny.
|
|
||||||
|
|
||||||
Dynamické výškové posuny sú cieľom nadmorská výška, ktorá zložka sa pohybuje smerom, relatívna
|
|
||||||
do pokojového stavu súčasti. Zaisťujú, že zmeny elevácie sú v súlade
|
|
||||||
naprieč akcií a typov komponentov. Napríklad všetky súčasti, ktoré vlek na lise majú
|
|
||||||
rovnaká zmena prevýšenie vo vzťahu k ich prevýšenie odpočinku.
|
|
||||||
|
|
||||||
Akonáhle je vstupná udalosť dokončenie alebo zrušená, bude zložka vráti do svojej pokojovej
|
|
||||||
nadmorská výška.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Vyhnúť sa rušenie elevácie.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Zložky s citlivými nadmorských výškach môže stretnúť s ďalšími komponentmi, ako sa pohybovať medzi
|
|
||||||
ich odpočinku vyvýšeniny a dynamické výškové odsadenie. Vzhľadom k tomu, materiál nemôže prejsť
|
|
||||||
prostredníctvom iného materiálu, komponenty nenarušovať spolu navzájom nejakom množstvo ciest,
|
|
||||||
či už na úrovni jednotlivých komponentov alebo s použitím kompletné rozloženie aplikácie.
|
|
||||||
|
|
||||||
Na úrovni komponentov môžu zložky presunúť alebo odstrániť skôr, než spôsobia rušenie.
|
|
||||||
Napríklad tlačidlo plávajúce akcie (FAB) môžu zmiznúť alebo presunúť mimo obrazovku pred
|
|
||||||
Užívateľ zdvihne kartu, alebo sa môže pohybovať, ak sa objaví snackbar.
|
|
||||||
|
|
||||||
Na úrovni Usporiadanie, riešenie rozvrhnutie aplikácie, aby sa minimalizovalo príležitostí k rušeniu.
|
|
||||||
Napríklad, umiestnenie FAB na jednej strane prúdu niekoľkých kariet, takže FAB nebude zasahovať
|
|
||||||
ak sa užívateľ pokúsi vyzdvihnúť jednu z kariet.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||||
<string name="reCaptcha_title">Výzva reCAPTCHA</string>
|
<string name="reCaptcha_title">Výzva reCAPTCHA</string>
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
<string name="default_resolution_title">Privzeta ločljivost</string>
|
<string name="default_resolution_title">Privzeta ločljivost</string>
|
||||||
<string name="play_with_kodi_title">Predvajaj s Kodi</string>
|
<string name="play_with_kodi_title">Predvajaj s Kodi</string>
|
||||||
<string name="kore_not_found">Programa Kore ni mogoče najti. Ali želite program namestiti?</string>
|
<string name="kore_not_found">Programa Kore ni mogoče najti. Ali želite program namestiti?</string>
|
||||||
<string name="installeKore">Namesti program Kore</string>
|
|
||||||
<string name="show_play_with_kodi_title">Pokaži možnost \"Predvajaj s Kodi\"</string>
|
<string name="show_play_with_kodi_title">Pokaži možnost \"Predvajaj s Kodi\"</string>
|
||||||
<string name="default_audio_format_title">Privzet zapis zvoka</string>
|
<string name="default_audio_format_title">Privzet zapis zvoka</string>
|
||||||
<string name="play_audio">Zvok</string>
|
<string name="play_audio">Zvok</string>
|
||||||
|
@ -40,10 +39,7 @@
|
||||||
<string name="list_thumbnail_view_description">Sličica predogleda videa</string>
|
<string name="list_thumbnail_view_description">Sličica predogleda videa</string>
|
||||||
<string name="detail_thumbnail_view_description">Sličica predogleda videa</string>
|
<string name="detail_thumbnail_view_description">Sličica predogleda videa</string>
|
||||||
<string name="detail_uploader_thumbnail_view_description">Sličica pošiljalnika</string>
|
<string name="detail_uploader_thumbnail_view_description">Sličica pošiljalnika</string>
|
||||||
<string name="autoplay_through_intent_title">Samodejno predvajanje prek vmesnika Intent</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Začne samodejno predvajanje videa, ko je zagnan prek drugega programa.</string>
|
|
||||||
<string name="show_play_with_kodi_summary">Pokaže možnost predvajanja videa preko predstavnega središča Kodi.</string>
|
<string name="show_play_with_kodi_summary">Pokaže možnost predvajanja videa preko predstavnega središča Kodi.</string>
|
||||||
<string name="settingsCategoryEtcTitle">Drugo</string>
|
|
||||||
|
|
||||||
<string name="detail_likes_img_view_description">Všeč mi je</string>
|
<string name="detail_likes_img_view_description">Všeč mi je</string>
|
||||||
<string name="detail_dislikes_img_view_description">Ni mi všeč</string>
|
<string name="detail_dislikes_img_view_description">Ni mi všeč</string>
|
||||||
|
|
|
@ -16,16 +16,12 @@
|
||||||
<string name="choose_browser">Отвори помоћу</string>
|
<string name="choose_browser">Отвори помоћу</string>
|
||||||
<string name="screen_rotation">ротација</string>
|
<string name="screen_rotation">ротација</string>
|
||||||
<string name="settings_activity_title">Поставке</string>
|
<string name="settings_activity_title">Поставке</string>
|
||||||
<string name="useExternalPlayerTitle">Користи спољашњи плејер</string>
|
|
||||||
<string name="download_path_title">Одредиште преузимања за видео</string>
|
<string name="download_path_title">Одредиште преузимања за видео</string>
|
||||||
<string name="download_path_summary">Путања за упис преузетих видеа.</string>
|
<string name="download_path_summary">Путања за упис преузетих видеа.</string>
|
||||||
<string name="download_path_dialog_title">Унесите путању за преузимање видеа</string>
|
<string name="download_path_dialog_title">Унесите путању за преузимање видеа</string>
|
||||||
<string name="autoplay_through_intent_title">Аутопуштање преко интента</string>
|
|
||||||
<string name="autoplay_through_intent_summary">Аутоматско пуштање видеа по позиву из друге апликације.</string>
|
|
||||||
<string name="default_resolution_title">Подразумевана резолуција</string>
|
<string name="default_resolution_title">Подразумевана резолуција</string>
|
||||||
<string name="play_with_kodi_title">Пусти помоћу Кодија</string>
|
<string name="play_with_kodi_title">Пусти помоћу Кодија</string>
|
||||||
<string name="kore_not_found">Апликација Кор (Kore) није нађена. Инсталирати Кор?</string>
|
<string name="kore_not_found">Апликација Кор (Kore) није нађена. Инсталирати Кор?</string>
|
||||||
<string name="installeKore">Инсталирај Кор</string>
|
|
||||||
<string name="show_play_with_kodi_title">Прикажи „Пусти помоћу Кодија“</string>
|
<string name="show_play_with_kodi_title">Прикажи „Пусти помоћу Кодија“</string>
|
||||||
<string name="show_play_with_kodi_summary">Приказ опције за пуштање видеа у Коди медија центру.</string>
|
<string name="show_play_with_kodi_summary">Приказ опције за пуштање видеа у Коди медија центру.</string>
|
||||||
<string name="play_audio">Аудио</string>
|
<string name="play_audio">Аудио</string>
|
||||||
|
@ -164,143 +160,6 @@
|
||||||
<string name="title_activity_channel">Активност канала</string>
|
<string name="title_activity_channel">Активност канала</string>
|
||||||
<string name="action_settings">Поставке</string>
|
<string name="action_settings">Поставке</string>
|
||||||
|
|
||||||
<string name="large_text">"
|
|
||||||
Material is the metaphor.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A material metaphor is the unifying theory of a rationalized space and a system of motion.
|
|
||||||
The material is grounded in tactile reality, inspired by the study of paper and ink, yet
|
|
||||||
technologically advanced and open to imagination and magic.
|
|
||||||
|
|
||||||
Surfaces and edges of the material provide visual cues that are grounded in reality. The
|
|
||||||
use of familiar tactile attributes helps users quickly understand affordances. Yet the
|
|
||||||
flexibility of the material creates new affordances that supercede those in the physical
|
|
||||||
world, without breaking the rules of physics.
|
|
||||||
|
|
||||||
The fundamentals of light, surface, and movement are key to conveying how objects move,
|
|
||||||
interact, and exist in space and in relation to each other. Realistic lighting shows
|
|
||||||
seams, divides space, and indicates moving parts.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Bold, graphic, intentional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The foundational elements of print based design typography, grids, space, scale, color,
|
|
||||||
and use of imagery guide visual treatments. These elements do far more than please the
|
|
||||||
eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge
|
|
||||||
imagery, large scale typography, and intentional white space create a bold and graphic
|
|
||||||
interface that immerse the user in the experience.
|
|
||||||
|
|
||||||
An emphasis on user actions makes core functionality immediately apparent and provides
|
|
||||||
waypoints for the user.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion provides meaning.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Motion respects and reinforces the user as the prime mover. Primary user actions are
|
|
||||||
inflection points that initiate motion, transforming the whole design.
|
|
||||||
|
|
||||||
All action takes place in a single environment. Objects are presented to the user without
|
|
||||||
breaking the continuity of experience even as they transform and reorganize.
|
|
||||||
|
|
||||||
Motion is meaningful and appropriate, serving to focus attention and maintain continuity.
|
|
||||||
Feedback is subtle yet clear. Transitions are efficient yet coherent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3D world.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The material environment is a 3D space, which means all objects have x, y, and z
|
|
||||||
dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the
|
|
||||||
positive z-axis extending towards the viewer. Every sheet of material occupies a single
|
|
||||||
position along the z-axis and has a standard 1dp thickness.
|
|
||||||
|
|
||||||
On the web, the z-axis is used for layering and not for perspective. The 3D world is
|
|
||||||
emulated by manipulating the y-axis.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Light and shadow.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Within the material environment, virtual lights illuminate the scene. Key lights create
|
|
||||||
directional shadows, while ambient light creates soft shadows from all angles.
|
|
||||||
|
|
||||||
Shadows in the material environment are cast by these two light sources. In Android
|
|
||||||
development, shadows occur when light sources are blocked by sheets of material at
|
|
||||||
various positions along the z-axis. On the web, shadows are depicted by manipulating the
|
|
||||||
y-axis only. The following example shows the card with a height of 6dp.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Resting elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
All material objects, regardless of size, have a resting elevation, or default elevation
|
|
||||||
that does not change. If an object changes elevation, it should return to its resting
|
|
||||||
elevation as soon as possible.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Component elevations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The resting elevation for a component type is consistent across apps (e.g., FAB elevation
|
|
||||||
does not vary from 6dp in one app to 16dp in another app).
|
|
||||||
|
|
||||||
Components may have different resting elevations across platforms, depending on the depth
|
|
||||||
of the environment (e.g., TV has a greater depth than mobile or desktop).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Responsive elevation and dynamic elevation offsets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some component types have responsive elevation, meaning they change elevation in response
|
|
||||||
to user input (e.g., normal, focused, and pressed) or system events. These elevation
|
|
||||||
changes are consistently implemented using dynamic elevation offsets.
|
|
||||||
|
|
||||||
Dynamic elevation offsets are the goal elevation that a component moves towards, relative
|
|
||||||
to the component’s resting state. They ensure that elevation changes are consistent
|
|
||||||
across actions and component types. For example, all components that lift on press have
|
|
||||||
the same elevation change relative to their resting elevation.
|
|
||||||
|
|
||||||
Once the input event is completed or cancelled, the component will return to its resting
|
|
||||||
elevation.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Avoiding elevation interference.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Components with responsive elevations may encounter other components as they move between
|
|
||||||
their resting elevations and dynamic elevation offsets. Because material cannot pass
|
|
||||||
through other material, components avoid interfering with one another any number of ways,
|
|
||||||
whether on a per component basis or using the entire app layout.
|
|
||||||
|
|
||||||
On a component level, components can move or be removed before they cause interference.
|
|
||||||
For example, a floating action button (FAB) can disappear or move off screen before a
|
|
||||||
user picks up a card, or it can move if a snackbar appears.
|
|
||||||
|
|
||||||
On the layout level, design your app layout to minimize opportunities for interference.
|
|
||||||
For example, position the FAB to one side of stream of a cards so the FAB won’t interfere
|
|
||||||
when a user tries to pick up one of cards.
|
|
||||||
|
|
||||||
|
|
||||||
"</string>
|
|
||||||
<string name="reCaptchaActivity">Стопка</string>
|
<string name="reCaptchaActivity">Стопка</string>
|
||||||
<string name="reCaptcha_title">reCAPTCHA стопка</string>
|
<string name="reCaptcha_title">reCAPTCHA стопка</string>
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,6 @@
|
||||||
<string name="no_available_dir">Lütfen bir kullanılabilir indirme dizini seçin.</string>
|
<string name="no_available_dir">Lütfen bir kullanılabilir indirme dizini seçin.</string>
|
||||||
|
|
||||||
<string name="title_activity_channel"/>
|
<string name="title_activity_channel"/>
|
||||||
<string name="large_text"/>
|
|
||||||
<string name="action_settings">Ayarlar</string>
|
<string name="action_settings">Ayarlar</string>
|
||||||
|
|
||||||
<string name="could_not_setup_download_menu">İndirme menüsü kurulamıyor.</string>
|
<string name="could_not_setup_download_menu">İndirme menüsü kurulamıyor.</string>
|
||||||
|
|
|
@ -23,8 +23,6 @@
|
||||||
<string name="download_path_title">视频下载路径</string>
|
<string name="download_path_title">视频下载路径</string>
|
||||||
<string name="download_path_summary">存放已下载视频的路径。</string>
|
<string name="download_path_summary">存放已下载视频的路径。</string>
|
||||||
<string name="download_path_dialog_title">输入视频的下载路径</string>
|
<string name="download_path_dialog_title">输入视频的下载路径</string>
|
||||||
<string name="autoplay_through_intent_title">刻意自动播放</string>
|
|
||||||
<string name="autoplay_through_intent_summary">当另一个程式发出要求时自动播放视频。</string>
|
|
||||||
<string name="default_resolution_title">默认分辨率</string>
|
<string name="default_resolution_title">默认分辨率</string>
|
||||||
<string name="play_with_kodi_title">用 Kodi 播放</string>
|
<string name="play_with_kodi_title">用 Kodi 播放</string>
|
||||||
<string name="kore_not_found">找不到 Kore 应用程式,您要安装 Kore 吗?</string>
|
<string name="kore_not_found">找不到 Kore 应用程式,您要安装 Kore 吗?</string>
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
<string name="download_path_title">影片下載路徑</string>
|
<string name="download_path_title">影片下載路徑</string>
|
||||||
<string name="download_path_summary">存放已下載影片的路徑。</string>
|
<string name="download_path_summary">存放已下載影片的路徑。</string>
|
||||||
<string name="download_path_dialog_title">輸入影片的下載路徑</string>
|
<string name="download_path_dialog_title">輸入影片的下載路徑</string>
|
||||||
<string name="autoplay_through_intent_title">刻意自動播放</string>
|
|
||||||
<string name="autoplay_through_intent_summary">當另一個程式發出要求時自動播放影片。</string>
|
|
||||||
<string name="default_resolution_title">預設解析度</string>
|
<string name="default_resolution_title">預設解析度</string>
|
||||||
<string name="play_with_kodi_title">用 Kodi 播放</string>
|
<string name="play_with_kodi_title">用 Kodi 播放</string>
|
||||||
<string name="kore_not_found">找不到 Kore 應用程式,您要安裝 Kore 嗎?</string>
|
<string name="kore_not_found">找不到 Kore 應用程式,您要安裝 Kore 嗎?</string>
|
||||||
|
|
|
@ -22,8 +22,6 @@
|
||||||
<string name="download_path_title">影片下載路徑</string>
|
<string name="download_path_title">影片下載路徑</string>
|
||||||
<string name="download_path_summary">存放已下載影片的路徑。</string>
|
<string name="download_path_summary">存放已下載影片的路徑。</string>
|
||||||
<string name="download_path_dialog_title">輸入影片的下載路徑</string>
|
<string name="download_path_dialog_title">輸入影片的下載路徑</string>
|
||||||
<string name="autoplay_through_intent_title">刻意自動播放</string>
|
|
||||||
<string name="autoplay_through_intent_summary">當另一個程式發出要求時自動播放影片。</string>
|
|
||||||
<string name="default_resolution_title">預設解析度</string>
|
<string name="default_resolution_title">預設解析度</string>
|
||||||
<string name="play_with_kodi_title">用 Kodi 播放</string>
|
<string name="play_with_kodi_title">用 Kodi 播放</string>
|
||||||
<string name="show_play_with_kodi_summary">顯示以 Kodi 媒體中心播放影片的選項。</string>
|
<string name="show_play_with_kodi_summary">顯示以 Kodi 媒體中心播放影片的選項。</string>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<string name="use_external_video_player_key" translatable="false">use_external_video_player</string>
|
<string name="use_external_video_player_key" translatable="false">use_external_video_player</string>
|
||||||
<string name="use_external_audio_player_key" translatable="false">use_external_audio_player</string>
|
<string name="use_external_audio_player_key" translatable="false">use_external_audio_player</string>
|
||||||
<string name="autoplay_through_intent_key" translatable="false">autoplay_through_intent</string>
|
<string name="autoplay_through_intent_key" translatable="false">autoplay_through_intent</string>
|
||||||
<string name="use_exoplayer_key" translatable="false">use_exoplayer</string>
|
<string name="use_old_player_key" translatable="false">use_oldplayer</string>
|
||||||
|
|
||||||
<string name="default_resolution_key" translatable="false">default_resolution_preference</string>
|
<string name="default_resolution_key" translatable="false">default_resolution_preference</string>
|
||||||
<string name="default_resolution_value" translatable="false">360p</string>
|
<string name="default_resolution_value" translatable="false">360p</string>
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
<string name="settings_activity_title">Settings</string>
|
<string name="settings_activity_title">Settings</string>
|
||||||
<string name="use_external_video_player_title">Use external video player</string>
|
<string name="use_external_video_player_title">Use external video player</string>
|
||||||
<string name="use_external_audio_player_title">Use external audio player</string>
|
<string name="use_external_audio_player_title">Use external audio player</string>
|
||||||
|
<string name="popup_mode_share_menu_title">NewPipe Popup mode</string>
|
||||||
|
|
||||||
<string name="download_path_title">Video download path</string>
|
<string name="download_path_title">Video download path</string>
|
||||||
<string name="download_path_summary">Path to store downloaded videos in.</string>
|
<string name="download_path_summary">Path to store downloaded videos in.</string>
|
||||||
|
@ -75,6 +76,7 @@
|
||||||
<string name="settings_category_other_title">Other</string>
|
<string name="settings_category_other_title">Other</string>
|
||||||
<string name="background_player_time_text" translatable="false">%1$s - NewPipe</string>
|
<string name="background_player_time_text" translatable="false">%1$s - NewPipe</string>
|
||||||
<string name="background_player_playing_toast">Playing in background</string>
|
<string name="background_player_playing_toast">Playing in background</string>
|
||||||
|
<string name="popup_playing_toast">Playing in popup mode</string>
|
||||||
<string name="c3s_url" translatable="false">https://www.c3s.cc/</string>
|
<string name="c3s_url" translatable="false">https://www.c3s.cc/</string>
|
||||||
<string name="play_btn_text">Play</string>
|
<string name="play_btn_text">Play</string>
|
||||||
<string name="content">Content</string>
|
<string name="content">Content</string>
|
||||||
|
@ -150,8 +152,8 @@
|
||||||
<string name="error_querying_decoders">Unable to query device decoders</string>
|
<string name="error_querying_decoders">Unable to query device decoders</string>
|
||||||
<string name="error_instantiating_decoder">Unable to instantiate decoder <xliff:g id="decoder_name">%1$s</xliff:g></string>
|
<string name="error_instantiating_decoder">Unable to instantiate decoder <xliff:g id="decoder_name">%1$s</xliff:g></string>
|
||||||
<string name="storage_permission_denied">Permission to access storage was denied</string>
|
<string name="storage_permission_denied">Permission to access storage was denied</string>
|
||||||
<string name="use_exoplayer_title">Use ExoPlayer</string>
|
<string name="use_old_player_title">Use old player</string>
|
||||||
<string name="use_exoplayer_summary">Experimental</string>
|
<string name="use_old_player_summary">Old build in Mediaframework player.</string>
|
||||||
<string name="videos">videos</string>
|
<string name="videos">videos</string>
|
||||||
<string name="subscriber">subscriber</string>
|
<string name="subscriber">subscriber</string>
|
||||||
<string name="subscribe">Subscribe</string>
|
<string name="subscribe">Subscribe</string>
|
||||||
|
@ -195,95 +197,6 @@
|
||||||
<string name="md5" translatable="false">MD5</string>
|
<string name="md5" translatable="false">MD5</string>
|
||||||
<string name="sha1" translatable="false">SHA1</string>
|
<string name="sha1" translatable="false">SHA1</string>
|
||||||
<string name="title_activity_channel">ChannelActivity</string>
|
<string name="title_activity_channel">ChannelActivity</string>
|
||||||
<string name="large_text" translatable="false">
|
|
||||||
"Material is the metaphor.\n\n"
|
|
||||||
|
|
||||||
"A material metaphor is the unifying theory of a rationalized space and a system of motion."
|
|
||||||
"The material is grounded in tactile reality, inspired by the study of paper and ink, yet "
|
|
||||||
"technologically advanced and open to imagination and magic.\n"
|
|
||||||
"Surfaces and edges of the material provide visual cues that are grounded in reality. The "
|
|
||||||
"use of familiar tactile attributes helps users quickly understand affordances. Yet the "
|
|
||||||
"flexibility of the material creates new affordances that supercede those in the physical "
|
|
||||||
"world, without breaking the rules of physics.\n"
|
|
||||||
"The fundamentals of light, surface, and movement are key to conveying how objects move, "
|
|
||||||
"interact, and exist in space and in relation to each other. Realistic lighting shows "
|
|
||||||
"seams, divides space, and indicates moving parts.\n\n"
|
|
||||||
|
|
||||||
"Bold, graphic, intentional.\n\n"
|
|
||||||
|
|
||||||
"The foundational elements of print based design typography, grids, space, scale, color, "
|
|
||||||
"and use of imagery guide visual treatments. These elements do far more than please the "
|
|
||||||
"eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge "
|
|
||||||
"imagery, large scale typography, and intentional white space create a bold and graphic "
|
|
||||||
"interface that immerse the user in the experience.\n"
|
|
||||||
"An emphasis on user actions makes core functionality immediately apparent and provides "
|
|
||||||
"waypoints for the user.\n\n"
|
|
||||||
|
|
||||||
"Motion provides meaning.\n\n"
|
|
||||||
|
|
||||||
"Motion respects and reinforces the user as the prime mover. Primary user actions are "
|
|
||||||
"inflection points that initiate motion, transforming the whole design.\n"
|
|
||||||
"All action takes place in a single environment. Objects are presented to the user without "
|
|
||||||
"breaking the continuity of experience even as they transform and reorganize.\n"
|
|
||||||
"Motion is meaningful and appropriate, serving to focus attention and maintain continuity. "
|
|
||||||
"Feedback is subtle yet clear. Transitions are efficient yet coherent.\n\n"
|
|
||||||
|
|
||||||
"3D world.\n\n"
|
|
||||||
|
|
||||||
"The material environment is a 3D space, which means all objects have x, y, and z "
|
|
||||||
"dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the "
|
|
||||||
"positive z-axis extending towards the viewer. Every sheet of material occupies a single "
|
|
||||||
"position along the z-axis and has a standard 1dp thickness.\n"
|
|
||||||
"On the web, the z-axis is used for layering and not for perspective. The 3D world is "
|
|
||||||
"emulated by manipulating the y-axis.\n\n"
|
|
||||||
|
|
||||||
"Light and shadow.\n\n"
|
|
||||||
|
|
||||||
"Within the material environment, virtual lights illuminate the scene. Key lights create "
|
|
||||||
"directional shadows, while ambient light creates soft shadows from all angles.\n"
|
|
||||||
"Shadows in the material environment are cast by these two light sources. In Android "
|
|
||||||
"development, shadows occur when light sources are blocked by sheets of material at "
|
|
||||||
"various positions along the z-axis. On the web, shadows are depicted by manipulating the "
|
|
||||||
"y-axis only. The following example shows the card with a height of 6dp.\n\n"
|
|
||||||
|
|
||||||
"Resting elevation.\n\n"
|
|
||||||
|
|
||||||
"All material objects, regardless of size, have a resting elevation, or default elevation "
|
|
||||||
"that does not change. If an object changes elevation, it should return to its resting "
|
|
||||||
"elevation as soon as possible.\n\n"
|
|
||||||
|
|
||||||
"Component elevations.\n\n"
|
|
||||||
|
|
||||||
"The resting elevation for a component type is consistent across apps (e.g., FAB elevation "
|
|
||||||
"does not vary from 6dp in one app to 16dp in another app).\n"
|
|
||||||
"Components may have different resting elevations across platforms, depending on the depth "
|
|
||||||
"of the environment (e.g., TV has a greater depth than mobile or desktop).\n\n"
|
|
||||||
|
|
||||||
"Responsive elevation and dynamic elevation offsets.\n\n"
|
|
||||||
|
|
||||||
"Some component types have responsive elevation, meaning they change elevation in response "
|
|
||||||
"to user input (e.g., normal, focused, and pressed) or system events. These elevation "
|
|
||||||
"changes are consistently implemented using dynamic elevation offsets.\n"
|
|
||||||
"Dynamic elevation offsets are the goal elevation that a component moves towards, relative "
|
|
||||||
"to the component’s resting state. They ensure that elevation changes are consistent "
|
|
||||||
"across actions and component types. For example, all components that lift on press have "
|
|
||||||
"the same elevation change relative to their resting elevation.\n"
|
|
||||||
"Once the input event is completed or cancelled, the component will return to its resting "
|
|
||||||
"elevation.\n\n"
|
|
||||||
|
|
||||||
"Avoiding elevation interference.\n\n"
|
|
||||||
|
|
||||||
"Components with responsive elevations may encounter other components as they move between "
|
|
||||||
"their resting elevations and dynamic elevation offsets. Because material cannot pass "
|
|
||||||
"through other material, components avoid interfering with one another any number of ways, "
|
|
||||||
"whether on a per component basis or using the entire app layout.\n"
|
|
||||||
"On a component level, components can move or be removed before they cause interference. "
|
|
||||||
"For example, a floating action button (FAB) can disappear or move off screen before a "
|
|
||||||
"user picks up a card, or it can move if a snackbar appears.\n"
|
|
||||||
"On the layout level, design your app layout to minimize opportunities for interference. "
|
|
||||||
"For example, position the FAB to one side of stream of a cards so the FAB won’t interfere "
|
|
||||||
"when a user tries to pick up one of cards.\n\n"
|
|
||||||
</string>
|
|
||||||
<string name="action_settings">Settings</string>
|
<string name="action_settings">Settings</string>
|
||||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||||
<string name="reCaptcha_title">reCAPTCHA Challenge</string>
|
<string name="reCaptcha_title">reCAPTCHA Challenge</string>
|
||||||
|
|
|
@ -2,18 +2,11 @@
|
||||||
|
|
||||||
<style name="RootTheme" parent="android:Theme.Holo"/>
|
<style name="RootTheme" parent="android:Theme.Holo"/>
|
||||||
|
|
||||||
<style name="PlayerTheme" parent="@style/RootTheme">
|
<style name="PlayerTheme" parent="Theme.AppCompat.NoActionBar">
|
||||||
<item name="android:windowNoTitle">true</item>
|
<item name="android:windowNoTitle">true</item>
|
||||||
<item name="android:windowBackground">@android:color/black</item>
|
<item name="android:windowBackground">@android:color/black</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="ExoPlayerButton">
|
|
||||||
<item name="android:layout_width">wrap_content</item>
|
|
||||||
<item name="android:layout_height">wrap_content</item>
|
|
||||||
<item name="android:minWidth">40dp</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="AppTheme" parent="Theme.AppCompat.Light">
|
<style name="AppTheme" parent="Theme.AppCompat.Light">
|
||||||
<item name="android:actionBarStyle">@style/NewPipeActionbarTheme</item>
|
<item name="android:actionBarStyle">@style/NewPipeActionbarTheme</item>
|
||||||
|
|
|
@ -34,9 +34,9 @@
|
||||||
android:defaultValue="@string/default_audio_format_value"/>
|
android:defaultValue="@string/default_audio_format_value"/>
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="@string/use_exoplayer_key"
|
android:key="@string/use_old_player_key"
|
||||||
android:title="@string/use_exoplayer_title"
|
android:title="@string/use_old_player_title"
|
||||||
android:summary="@string/use_exoplayer_summary"
|
android:summary="@string/use_old_player_summary"
|
||||||
android:defaultValue="false"/>
|
android:defaultValue="false"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
|
|
|
@ -11,9 +11,9 @@
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg2"
|
id="svg2"
|
||||||
viewBox="0 0 192 192"
|
viewBox="0 0 192 192"
|
||||||
height="192"
|
height="204.8"
|
||||||
width="192"
|
width="204.8"
|
||||||
inkscape:version="0.91 r13725"
|
inkscape:version="0.92.1 r"
|
||||||
sodipodi:docname="new_pipe_icon_5.svg"
|
sodipodi:docname="new_pipe_icon_5.svg"
|
||||||
inkscape:export-filename="/home/the-scrabi/Projects/NewPipe/assets/new_pipe_icon_5.png"
|
inkscape:export-filename="/home/the-scrabi/Projects/NewPipe/assets/new_pipe_icon_5.png"
|
||||||
inkscape:export-xdpi="120"
|
inkscape:export-xdpi="120"
|
||||||
|
@ -31,9 +31,9 @@
|
||||||
inkscape:window-height="1012"
|
inkscape:window-height="1012"
|
||||||
id="namedview4149"
|
id="namedview4149"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:zoom="2.2262658"
|
inkscape:zoom="1.2836556"
|
||||||
inkscape:cx="115.37498"
|
inkscape:cx="361.53411"
|
||||||
inkscape:cy="51.93678"
|
inkscape:cy="-71.516938"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="32"
|
inkscape:window-y="32"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
|
@ -89,7 +89,7 @@
|
||||||
id="feComposite4464" />
|
id="feComposite4464" />
|
||||||
</filter>
|
</filter>
|
||||||
<filter
|
<filter
|
||||||
style="color-interpolation-filters:sRGB;"
|
style="color-interpolation-filters:sRGB"
|
||||||
inkscape:label="Drop Shadow"
|
inkscape:label="Drop Shadow"
|
||||||
id="filter4777">
|
id="filter4777">
|
||||||
<feFlood
|
<feFlood
|
||||||
|
@ -154,7 +154,7 @@
|
||||||
result="composite2" />
|
result="composite2" />
|
||||||
</filter>
|
</filter>
|
||||||
<filter
|
<filter
|
||||||
style="color-interpolation-filters:sRGB;"
|
style="color-interpolation-filters:sRGB"
|
||||||
inkscape:label="Drop Shadow"
|
inkscape:label="Drop Shadow"
|
||||||
id="filter4885">
|
id="filter4885">
|
||||||
<feFlood
|
<feFlood
|
||||||
|
@ -219,7 +219,7 @@
|
||||||
result="composite2" />
|
result="composite2" />
|
||||||
</filter>
|
</filter>
|
||||||
<filter
|
<filter
|
||||||
style="color-interpolation-filters:sRGB;"
|
style="color-interpolation-filters:sRGB"
|
||||||
inkscape:label="Drop Shadow"
|
inkscape:label="Drop Shadow"
|
||||||
id="filter4257">
|
id="filter4257">
|
||||||
<feFlood
|
<feFlood
|
||||||
|
@ -284,7 +284,7 @@
|
||||||
result="composite2" />
|
result="composite2" />
|
||||||
</filter>
|
</filter>
|
||||||
<filter
|
<filter
|
||||||
style="color-interpolation-filters:sRGB;"
|
style="color-interpolation-filters:sRGB"
|
||||||
inkscape:label="Drop Shadow"
|
inkscape:label="Drop Shadow"
|
||||||
id="filter4192">
|
id="filter4192">
|
||||||
<feFlood
|
<feFlood
|
||||||
|
@ -316,7 +316,7 @@
|
||||||
id="feComposite4202" />
|
id="feComposite4202" />
|
||||||
</filter>
|
</filter>
|
||||||
<filter
|
<filter
|
||||||
style="color-interpolation-filters:sRGB;"
|
style="color-interpolation-filters:sRGB"
|
||||||
inkscape:label="Drop Shadow"
|
inkscape:label="Drop Shadow"
|
||||||
id="filter4349">
|
id="filter4349">
|
||||||
<feFlood
|
<feFlood
|
||||||
|
@ -348,7 +348,7 @@
|
||||||
id="feComposite4359" />
|
id="feComposite4359" />
|
||||||
</filter>
|
</filter>
|
||||||
<filter
|
<filter
|
||||||
style="color-interpolation-filters:sRGB;"
|
style="color-interpolation-filters:sRGB"
|
||||||
inkscape:label="Drop Shadow"
|
inkscape:label="Drop Shadow"
|
||||||
id="filter4361">
|
id="filter4361">
|
||||||
<feFlood
|
<feFlood
|
||||||
|
@ -380,7 +380,7 @@
|
||||||
id="feComposite4371" />
|
id="feComposite4371" />
|
||||||
</filter>
|
</filter>
|
||||||
<filter
|
<filter
|
||||||
style="color-interpolation-filters:sRGB;"
|
style="color-interpolation-filters:sRGB"
|
||||||
inkscape:label="Drop Shadow"
|
inkscape:label="Drop Shadow"
|
||||||
id="filter4481">
|
id="filter4481">
|
||||||
<feFlood
|
<feFlood
|
||||||
|
@ -412,7 +412,7 @@
|
||||||
id="feComposite4491" />
|
id="feComposite4491" />
|
||||||
</filter>
|
</filter>
|
||||||
<filter
|
<filter
|
||||||
style="color-interpolation-filters:sRGB;"
|
style="color-interpolation-filters:sRGB"
|
||||||
inkscape:label="Drop Shadow"
|
inkscape:label="Drop Shadow"
|
||||||
id="filter4433">
|
id="filter4433">
|
||||||
<feFlood
|
<feFlood
|
||||||
|
@ -453,7 +453,7 @@
|
||||||
fy="0.35701406"
|
fy="0.35701406"
|
||||||
r="88"
|
r="88"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(0.00132321,2.1587518,-2.1815784,0.00133718,200.1606,-33.408986)" />
|
gradientTransform="matrix(0.00132321,2.1587518,-2.1815784,0.00133718,1.1369842,-0.39215567)" />
|
||||||
</defs>
|
</defs>
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata7">
|
id="metadata7">
|
||||||
|
@ -472,7 +472,9 @@
|
||||||
id="path4144-9"
|
id="path4144-9"
|
||||||
r="88"
|
r="88"
|
||||||
cy="104"
|
cy="104"
|
||||||
cx="88" />
|
cx="88"
|
||||||
|
d=""
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
<circle
|
<circle
|
||||||
style="fill:#ff5252;fill-opacity:1;stroke:none;stroke-width:17.10300064;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
style="fill:#ff5252;fill-opacity:1;stroke:none;stroke-width:17.10300064;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
id="path4144-6"
|
id="path4144-6"
|
||||||
|
@ -507,12 +509,12 @@
|
||||||
<circle
|
<circle
|
||||||
style="opacity:1;fill:url(#radialGradient4453);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
style="opacity:1;fill:url(#radialGradient4453);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
id="path4445"
|
id="path4445"
|
||||||
cx="295.0256"
|
cx="96.001991"
|
||||||
cy="63.005043"
|
cy="96.021873"
|
||||||
r="88" />
|
r="88" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4433)"
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4433)"
|
||||||
d="m 62.03771,154.84774 17.847497,-11.37613 0.373296,-75.40567 45.924707,27.26706 -33.232665,19.16292 0,21.92836 L 161.9848,95.333 61.944386,36.538494 Z"
|
d="M 62.03771,154.84774 79.885207,143.47161 80.258503,68.06594 126.18321,95.333 92.950545,114.49592 v 21.92836 L 161.9848,95.333 61.944386,36.538494 Z"
|
||||||
id="path4234"
|
id="path4234"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccccccc" />
|
sodipodi:nodetypes="ccccccccc" />
|
||||||
|
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |