diff --git a/mobile/android/focus-android/.gitignore b/mobile/android/focus-android/.gitignore new file mode 100644 index 000000000000..345f9b31db7f --- /dev/null +++ b/mobile/android/focus-android/.gitignore @@ -0,0 +1,41 @@ +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# Intellij +*.iml +.idea/ + +# Keystore files +*.jks + diff --git a/mobile/android/focus-android/app/.gitignore b/mobile/android/focus-android/app/.gitignore new file mode 100644 index 000000000000..796b96d1c402 --- /dev/null +++ b/mobile/android/focus-android/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/mobile/android/focus-android/app/build.gradle b/mobile/android/focus-android/app/build.gradle new file mode 100644 index 000000000000..7c6fe3e4c06b --- /dev/null +++ b/mobile/android/focus-android/app/build.gradle @@ -0,0 +1,30 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 24 + buildToolsVersion "24.0.0" + defaultConfig { + applicationId "org.mozilla.focus" + minSdkVersion 21 + targetSdkVersion 24 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:24.2.1' + compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha3' + testCompile 'junit:junit:4.12' +} diff --git a/mobile/android/focus-android/app/proguard-rules.pro b/mobile/android/focus-android/app/proguard-rules.pro new file mode 100644 index 000000000000..50e2b38a9758 --- /dev/null +++ b/mobile/android/focus-android/app/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/sebastian/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/mobile/android/focus-android/app/src/main/AndroidManifest.xml b/mobile/android/focus-android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..91b1d11cc71c --- /dev/null +++ b/mobile/android/focus-android/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/activity/BrowserActivity.java b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/activity/BrowserActivity.java new file mode 100644 index 000000000000..0a6d13ecb26b --- /dev/null +++ b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/activity/BrowserActivity.java @@ -0,0 +1,62 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.focus.activity; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; +import android.webkit.WebChromeClient; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import org.mozilla.focus.R; +import org.mozilla.focus.widget.UrlBar; + +public class BrowserActivity extends Activity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + getWindow().setStatusBarColor(Color.TRANSPARENT); + + setContentView(R.layout.activity_browser); + + final UrlBar urlBar = (UrlBar) findViewById(R.id.urlbar); + + final WebView webView = (WebView) findViewById(R.id.webview); + webView.setWebViewClient(new WebViewClient() { + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + urlBar.onPageStarted(url); + } + + @Override + public void onPageFinished(WebView view, String url) { + urlBar.onPageFinished(); + } + }); + webView.setWebChromeClient(new WebChromeClient() { + + }); + + urlBar.setOnUrlEnteredListener(new UrlBar.OnUrlAction() { + @Override + public void onUrlEntered(String url) { + webView.loadUrl(url); + } + + @Override + public void onErase() { + finish(); + } + }); + } +} diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/activity/MainActivity.java b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/activity/MainActivity.java new file mode 100644 index 000000000000..dc93d349661d --- /dev/null +++ b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/activity/MainActivity.java @@ -0,0 +1,43 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.focus.activity; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.support.v4.app.ActivityOptionsCompat; +import android.view.View; + +import org.mozilla.focus.R; + +public class MainActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + getWindow().setStatusBarColor(Color.TRANSPARENT); + + setContentView(R.layout.activity_main); + + final View urlView = findViewById(R.id.url); + + urlView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(MainActivity.this, BrowserActivity.class); + + ActivityOptionsCompat options = ActivityOptionsCompat. + makeSceneTransitionAnimation(MainActivity.this, urlView, "urlbar"); + + startActivity(intent, options.toBundle()); + } + }); + } +} diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/utils/UrlUtils.java b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/utils/UrlUtils.java new file mode 100644 index 000000000000..9a4e12e66c10 --- /dev/null +++ b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/utils/UrlUtils.java @@ -0,0 +1,21 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.focus.utils; + +import android.net.Uri; +import android.text.TextUtils; + +public class UrlUtils { + public static String normalize(String input) { + Uri uri = Uri.parse(input); + + if (TextUtils.isEmpty(uri.getScheme())) { + uri = uri.buildUpon().scheme("http").build(); + } + + return uri.toString(); + } +} diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/widget/UrlBar.java b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/widget/UrlBar.java new file mode 100644 index 000000000000..1488e353f81f --- /dev/null +++ b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/widget/UrlBar.java @@ -0,0 +1,105 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.focus.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.ViewFlipper; + +import org.mozilla.focus.R; +import org.mozilla.focus.utils.UrlUtils; + +public class UrlBar extends ViewFlipper { + public interface OnUrlAction { + void onUrlEntered(String url); + + void onErase(); + } + + private OnUrlAction listener; + + private EditText urlEditView; + private TextView urlDisplayView; + + public UrlBar(Context context) { + super(context); + + init(); + } + + public UrlBar(Context context, AttributeSet attrs) { + super(context, attrs); + + init(); + } + + private void init() { + setBackgroundColor(0xFF444444); + + int result = 0; + int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = getResources().getDimensionPixelSize(resourceId); + } + setPadding(0, result, 0, 0); + } + + public void onPageStarted(String url) { + setBackgroundColor(0xFF444444); + + urlDisplayView.setText(url); + urlEditView.setText(url); + } + + public void onPageFinished() { + setBackgroundResource(R.drawable.gradient_background); + } + + public void setOnUrlEnteredListener(OnUrlAction listener) { + this.listener = listener; + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + urlEditView = (EditText) findViewById(R.id.url_edit); + urlDisplayView = (TextView) findViewById(R.id.url); + + urlEditView.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { + if (actionId == EditorInfo.IME_ACTION_GO) { + final String url = UrlUtils.normalize(textView.getText().toString()); + + if (listener != null) { + listener.onUrlEntered(url); + } + + urlDisplayView.setText(url); + + showNext(); + return true; + } + return false; + } + }); + + findViewById(R.id.erase).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (listener != null) { + listener.onErase(); + } + } + }); + } +} diff --git a/mobile/android/focus-android/app/src/main/res/drawable/gradient_background.xml b/mobile/android/focus-android/app/src/main/res/drawable/gradient_background.xml new file mode 100644 index 000000000000..1822875fe9b7 --- /dev/null +++ b/mobile/android/focus-android/app/src/main/res/drawable/gradient_background.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/mobile/android/focus-android/app/src/main/res/drawable/urlbar_background.xml b/mobile/android/focus-android/app/src/main/res/drawable/urlbar_background.xml new file mode 100644 index 000000000000..9802fe0a093b --- /dev/null +++ b/mobile/android/focus-android/app/src/main/res/drawable/urlbar_background.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/mobile/android/focus-android/app/src/main/res/layout/activity_browser.xml b/mobile/android/focus-android/app/src/main/res/layout/activity_browser.xml new file mode 100644 index 000000000000..82579eed8216 --- /dev/null +++ b/mobile/android/focus-android/app/src/main/res/layout/activity_browser.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + diff --git a/mobile/android/focus-android/app/src/main/res/layout/activity_main.xml b/mobile/android/focus-android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000000..59f817eea826 --- /dev/null +++ b/mobile/android/focus-android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + diff --git a/mobile/android/focus-android/app/src/main/res/layout/item_urlbar_display.xml b/mobile/android/focus-android/app/src/main/res/layout/item_urlbar_display.xml new file mode 100644 index 000000000000..cdf56ed35d4e --- /dev/null +++ b/mobile/android/focus-android/app/src/main/res/layout/item_urlbar_display.xml @@ -0,0 +1,34 @@ + + + + + + + + +