package com.dm.wallpaper.board.activities;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.NavigationView;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.graphics.drawable.DrawerArrowDrawable;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.danimahardhika.android.helpers.core.ColorHelper;
import com.danimahardhika.android.helpers.core.DrawableHelper;
import com.danimahardhika.android.helpers.core.SoftKeyboardHelper;
import com.danimahardhika.android.helpers.core.ViewHelper;
import com.danimahardhika.android.helpers.core.WindowHelper;
import com.danimahardhika.android.helpers.license.LicenseHelper;
import com.danimahardhika.android.helpers.permission.PermissionCode;
import com.dm.wallpaper.board.R;
import com.dm.wallpaper.board.R2;
import com.dm.wallpaper.board.databases.Database;
import com.dm.wallpaper.board.fragments.AboutFragment;
import com.dm.wallpaper.board.fragments.FavoritesFragment;
import com.dm.wallpaper.board.fragments.SettingsFragment;
import com.dm.wallpaper.board.fragments.WallpapersFragment;
import com.dm.wallpaper.board.fragments.dialogs.InAppBillingFragment;
import com.dm.wallpaper.board.helpers.InAppBillingHelper;
import com.dm.wallpaper.board.helpers.LicenseCallbackHelper;
import com.dm.wallpaper.board.helpers.LocaleHelper;
import com.dm.wallpaper.board.items.InAppBilling;
import com.dm.wallpaper.board.preferences.Preferences;
import com.dm.wallpaper.board.receivers.WallpaperBoardReceiver;
import com.dm.wallpaper.board.services.WallpaperBoardService;
import com.dm.wallpaper.board.utils.Extras;
import com.dm.wallpaper.board.utils.ImageConfig;
import com.dm.wallpaper.board.utils.LogUtil;
import com.dm.wallpaper.board.utils.listeners.InAppBillingListener;
import com.dm.wallpaper.board.utils.listeners.SearchListener;
import com.dm.wallpaper.board.utils.listeners.WallpaperBoardListener;
import com.dm.wallpaper.board.utils.views.HeaderView;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;
import butterknife.BindView;
import butterknife.ButterKnife;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
import static com.dm.wallpaper.board.helpers.ViewHelper.getNavigationViewHeaderStyle;
/*
* Wallpaper Board
*
* Copyright (c) 2017 Dani Mahardhika
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class WallpaperBoardActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback,
WallpaperBoardListener, InAppBillingListener, SearchListener {
@BindView(R2.id.toolbar_title)
TextView mToolbarTitle;
@BindView(R2.id.toolbar_logo)
TextView mToolbarLogo;
@BindView(R2.id.navigation_view)
NavigationView mNavigationView;
@BindView(R2.id.drawer_layout)
DrawerLayout mDrawerLayout;
@BindView(R2.id.appbar)
AppBarLayout mAppBar;
private BillingProcessor mBillingProcessor;
private ActionBarDrawerToggle mDrawerToggle;
private FragmentManager mFragManager;
private WallpaperBoardReceiver mReceiver;
private LicenseHelper mLicenseHelper;
private String mFragmentTag;
private int mPosition, mLastPosition;
private String mLicenseKey;
private String[] mDonationProductsId;
public static boolean sRszIoAvailable;
public void initMainActivity(@Nullable Bundle savedInstanceState, boolean isLicenseCheckerEnabled,
@NonNull byte[] salt, @NonNull String licenseKey,
@NonNull String[] donationProductsId) {
super.setTheme(Preferences.get(this).isDarkTheme() ?
R.style.AppThemeDark : R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wallpaper_board);
ButterKnife.bind(this);
WindowHelper.resetNavigationBarTranslucent(this,
WindowHelper.NavigationBarTranslucent.PORTRAIT_ONLY);
registerBroadcastReceiver();
SoftKeyboardHelper softKeyboardHelper = new SoftKeyboardHelper(this,
findViewById(R.id.container));
softKeyboardHelper.enable();
mFragManager = getSupportFragmentManager();
mLicenseKey = licenseKey;
mDonationProductsId = donationProductsId;
Toolbar toolbar = ButterKnife.findById(this, R.id.toolbar);
toolbar.setTitle("");
setSupportActionBar(toolbar);
ViewHelper.setupToolbar(toolbar);
initNavigationView(toolbar);
initNavigationViewHeader();
initAppBar();
initInAppBilling();
mPosition = mLastPosition = 0;
if (savedInstanceState != null) {
mPosition = mLastPosition = savedInstanceState.getInt(Extras.EXTRA_POSITION, 0);
}
setFragment(getFragment(mPosition));
if (Preferences.get(this).isFirstRun() && isLicenseCheckerEnabled) {
mLicenseHelper = new LicenseHelper(this);
mLicenseHelper.run(mLicenseKey, salt, new LicenseCallbackHelper(this));
return;
}
checkWallpapers();
if (isLicenseCheckerEnabled && !Preferences.get(this).isLicensed()) {
finish();
}
}
@Override
protected void attachBaseContext(Context newBase) {
LocaleHelper.setLocale(newBase);
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(Extras.EXTRA_POSITION, mPosition);
super.onSaveInstanceState(outState);
}
@Override
protected void onDestroy() {
if (mBillingProcessor != null) {
mBillingProcessor.release();
mBillingProcessor = null;
}
if (mLicenseHelper != null) {
mLicenseHelper.destroy();
}
if (mReceiver != null) unregisterReceiver(mReceiver);
super.onDestroy();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
resetNavigationView(newConfig.orientation);
WindowHelper.resetNavigationBarTranslucent(this, WindowHelper.NavigationBarTranslucent.PORTRAIT_ONLY);
LocaleHelper.setLocale(this);
}
@Override
public void onBackPressed() {
if (mFragManager.getBackStackEntryCount() > 0) {
clearBackStack();
return;
}
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawers();
return;
}
if (!mFragmentTag.equals(Extras.TAG_WALLPAPERS)) {
mPosition = mLastPosition = 0;
setFragment(getFragment(mPosition));
return;
}
super.onBackPressed();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mBillingProcessor.handleActivityResult(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PermissionCode.STORAGE) {
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
WallpapersFragment fragment = (WallpapersFragment) mFragManager
.findFragmentByTag(Extras.TAG_WALLPAPERS);
if (fragment != null) {
fragment.downloadWallpaper();
}
} else {
Toast.makeText(this, R.string.permission_storage_denied, Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onWallpapersChecked(@Nullable Intent intent) {
if (intent != null) {
String packageName = intent.getStringExtra("packageName");
LogUtil.d("Broadcast received from service with packageName: " +packageName);
if (packageName == null)
return;
if (!packageName.equals(getPackageName())) {
LogUtil.d("Received broadcast from different packageName, expected: " +getPackageName());
return;
}
int size = intent.getIntExtra(Extras.EXTRA_SIZE, 0);
Database database = new Database(this);
int offlineSize = database.getWallpapersCount();
Preferences.get(this).setAvailableWallpapersCount(size);
if (size > offlineSize) {
int accent = ColorHelper.getAttributeColor(this, R.attr.colorAccent);
LinearLayout container = (LinearLayout) mNavigationView.getMenu().getItem(0).getActionView();
if (container != null) {
TextView counter = (TextView) container.findViewById(R.id.counter);
if (counter == null) return;
ViewCompat.setBackground(counter, DrawableHelper.getTintedDrawable(this,
R.drawable.ic_toolbar_circle, accent));
counter.setTextColor(ColorHelper.getTitleTextColor(accent));
int newItem = (size - offlineSize);
counter.setText(String.valueOf(newItem > 99 ? "99+" : newItem));
container.setVisibility(View.VISIBLE);
if (mFragmentTag.equals(Extras.TAG_WALLPAPERS)) {
WallpapersFragment fragment = (WallpapersFragment)
mFragManager.findFragmentByTag(Extras.TAG_WALLPAPERS);
if (fragment != null) fragment.showPopupBubble();
}
return;
}
}
}
LinearLayout container = (LinearLayout) mNavigationView.getMenu().getItem(0).getActionView();
if (container != null) container.setVisibility(View.GONE);
}
@Override
public void onInAppBillingInitialized(boolean success) {
if (!success) mBillingProcessor = null;
}
@Override
public void onInAppBillingSelected(InAppBilling product) {
if (mBillingProcessor == null) return;
mBillingProcessor.purchase(this, product.getProductId());
}
@Override
public void onInAppBillingConsume(String productId) {
if (mBillingProcessor == null) return;
if (mBillingProcessor.consumePurchase(productId)) {
new MaterialDialog.Builder(this)
.title(R.string.navigation_view_donate)
.content(R.string.donation_success)
.positiveText(R.string.close)
.show();
}
}
@Override
public void onSearchExpanded(boolean expand) {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (expand) {
int icon = ColorHelper.getAttributeColor(this, R.attr.toolbar_icon);
toolbar.setNavigationIcon(DrawableHelper.getTintedDrawable(
this, R.drawable.ic_toolbar_back, icon));
toolbar.setNavigationOnClickListener(view -> onBackPressed());
} else {
SoftKeyboardHelper.closeKeyboard(this);
mDrawerToggle.setDrawerArrowDrawable(new DrawerArrowDrawable(this));
toolbar.setNavigationOnClickListener(view ->
mDrawerLayout.openDrawer(GravityCompat.START));
}
mDrawerLayout.setDrawerLockMode(expand ? DrawerLayout.LOCK_MODE_LOCKED_CLOSED :
DrawerLayout.LOCK_MODE_UNLOCKED);
supportInvalidateOptionsMenu();
}
private void initNavigationView(Toolbar toolbar) {
resetNavigationView(getResources().getConfiguration().orientation);
mDrawerToggle = new ActionBarDrawerToggle(
this, mDrawerLayout, toolbar, R.string.txt_open, R.string.txt_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (mPosition == 4) {
mPosition = mLastPosition;
mNavigationView.getMenu().getItem(mPosition).setChecked(true);
InAppBillingFragment.showInAppBillingDialog(mFragManager,
mBillingProcessor,
mLicenseKey,
mDonationProductsId);
return;
}
if (mPosition != mLastPosition) {
mLastPosition = mPosition;
setFragment(getFragment(mPosition));
}
}
};
mDrawerLayout.setDrawerShadow(R.drawable.navigation_view_shadow, GravityCompat.START);
mDrawerLayout.addDrawerListener(mDrawerToggle);
ColorStateList colorStateList = ContextCompat.getColorStateList(this,
Preferences.get(this).isDarkTheme() ?
R.color.navigation_view_item_highlight_dark :
R.color.navigation_view_item_highlight);
mNavigationView.getMenu().getItem(mNavigationView.getMenu().size() - 2).setVisible(
getResources().getBoolean(R.bool.enable_donation));
mNavigationView.setItemTextColor(colorStateList);
mNavigationView.setItemIconTintList(colorStateList);
Drawable background = ContextCompat.getDrawable(this,
Preferences.get(this).isDarkTheme() ?
R.drawable.navigation_view_item_background_dark :
R.drawable.navigation_view_item_background);
mNavigationView.setItemBackground(background);
mNavigationView.setNavigationItemSelectedListener(item -> {
int id = item.getItemId();
if (id == R.id.navigation_view_wallpapers) mPosition = 0;
else if (id == R.id.navigation_view_favorites) mPosition = 1;
else if (id == R.id.navigation_view_settings) mPosition = 2;
else if (id == R.id.navigation_view_about) mPosition = 3;
else if (id == R.id.navigation_view_donate) mPosition = 4;
item.setChecked(true);
mDrawerLayout.closeDrawers();
return true;
});
ViewHelper.hideNavigationViewScrollBar(mNavigationView);
}
private void initNavigationViewHeader() {
String imageUrl = getResources().getString(R.string.navigation_view_header);
String titleText = getResources().getString(R.string.navigation_view_header_title);
View header = mNavigationView.getHeaderView(0);
HeaderView image = ButterKnife.findById(header, R.id.header_image);
LinearLayout container = ButterKnife.findById(header, R.id.header_title_container);
TextView title = ButterKnife.findById(header, R.id.header_title);
TextView version = ButterKnife.findById(header, R.id.header_version);
Point point = getNavigationViewHeaderStyle(getResources().getString(R.string.navigation_view_header_style));
image.setRatio(point.x, point.y);
if (titleText.length() == 0) {
container.setVisibility(View.GONE);
} else {
title.setText(titleText);
try {
String versionText = "v" + getPackageManager()
.getPackageInfo(getPackageName(), 0).versionName;
version.setText(versionText);
} catch (Exception ignored) {}
}
if (ColorHelper.isValidColor(imageUrl)) {
image.setBackgroundColor(Color.parseColor(imageUrl));
return;
}
if (!URLUtil.isValidUrl(imageUrl)) {
imageUrl = "drawable://" + DrawableHelper.getResourceId(this, imageUrl);
}
ImageLoader.getInstance().displayImage(imageUrl, new ImageViewAware(image),
ImageConfig.getDefaultImageOptions(), new ImageSize(720, 720), null, null);
}
private void initInAppBilling() {
if (!getResources().getBoolean(R.bool.enable_donation)) return;
if (mBillingProcessor != null) return;
if (BillingProcessor.isIabServiceAvailable(this)) {
mBillingProcessor = new BillingProcessor(this,
mLicenseKey, new InAppBillingHelper(this));
}
}
private void initAppBar() {
mAppBar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> {
int maxScroll = mAppBar.getTotalScrollRange();
float percentage = (float) Math.abs(verticalOffset) / (float) maxScroll;
if (percentage == 0f) {
ColorHelper.setupStatusBarIconColor(this);
} else if (percentage == 1f) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
View view = getWindow().getDecorView();
if (view != null) {
view.setSystemUiVisibility(0);
}
}
}
});
}
private void registerBroadcastReceiver() {
IntentFilter filter = new IntentFilter(WallpaperBoardReceiver.PROCESS_RESPONSE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
mReceiver = new WallpaperBoardReceiver();
registerReceiver(mReceiver, filter);
}
private void checkWallpapers() {
int wallpapersCount = new Database(this).getWallpapersCount();
if (Preferences.get(this).isConnectedToNetwork() && (wallpapersCount > 0)) {
Intent intent = new Intent(this, WallpaperBoardService.class);
startService(intent);
return;
}
int size = Preferences.get(this).getAvailableWallpapersCount();
if (size > 0) {
onWallpapersChecked(new Intent()
.putExtra(Extras.EXTRA_SIZE, size)
.putExtra(Extras.EXTRA_PACKAGE_NAME, getPackageName()));
}
}
private void resetNavigationView(int orientation) {
int index = mNavigationView.getMenu().size() - 1;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
mNavigationView.getMenu().getItem(index).setVisible(true);
mNavigationView.getMenu().getItem(index).setEnabled(false);
return;
}
}
mNavigationView.getMenu().getItem(index).setVisible(false);
}
private void setFragment(Fragment fragment) {
if (fragment == null) return;
clearBackStack();
mAppBar.setExpanded(true);
FragmentTransaction ft = mFragManager.beginTransaction().replace(
R.id.container, fragment, mFragmentTag);
try {
ft.commit();
} catch (Exception e) {
ft.commitAllowingStateLoss();
}
mNavigationView.getMenu().getItem(mPosition).setChecked(true);
resetToolbarLogo();
mToolbarTitle.setText(mNavigationView.getMenu().getItem(mPosition).getTitle());
}
@Nullable
private Fragment getFragment(int position) {
if (position == 0) {
mFragmentTag = Extras.TAG_WALLPAPERS;
return new WallpapersFragment();
} else if (position == 1) {
mFragmentTag = Extras.TAG_FAVORITES;
return new FavoritesFragment();
} else if (position == 2) {
mFragmentTag = Extras.TAG_SETTINGS;
return new SettingsFragment();
} else if (position == 3) {
mFragmentTag = Extras.TAG_ABOUT;
return new AboutFragment();
}
return null;
}
private void resetToolbarLogo() {
mToolbarTitle.setVisibility(mPosition == 0 ? View.GONE : View.VISIBLE);
mToolbarLogo.setVisibility(mPosition == 0 ? View.VISIBLE : View.GONE);
}
private void clearBackStack() {
if (mFragManager.getBackStackEntryCount() > 0) {
mFragManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
onSearchExpanded(false);
}
}
}